Correcting teacher:Guanhui
Correction status:qualified
Teacher's comments:写的很好!效果图展示方式挺好!不过编辑器代码和浏览器结果可以放大些。
作用域作用:
1.变量的生效范围
2.作用域是直接查找变量的工具
代码示例:
<?php
// 显示错误
error_reporting(E_ALL);
// 作用域
// 1.全局作用域
$sitenName = 'PHP中文网';
// 2.函数作用域
function getInfo(){
$name = 'peter';
return $name;
}
// 输出
echo $sitenName.'<br>';//正常输出
echo $name,'<hr>';//报错,因为因为变量的作用域是函数作用域,只能在函数内部访问,不能够直接访问函数外部变量
//通过调用函数方式来进行访问
echo getInfo();
echo '<hr>';
// 在函数作用域中访问全部变量,有2种方式
// 1.使用global关键字,表示调用全局变量
function keyword(){
global $sitenName;//表示调用此变量为全局变量;
return $sitenName;
}
//输出
echo keyword();
echo '<hr>';
// 2.使用超全局变量进行访问
// 超全局变量在每个脚本中都有定义
function all(){
return $GLOBALS['sitenName'];//在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)
}
echo all();
echo '<hr>';
// 在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素
// 查看每个脚本中预定义的超全局变量
echo '<pre>'.print_r($GLOBALS,true).'</pre>';
浏览器演示:
注:超全局变量不受作用域限制,可在函数中直接显示
序号 | 代码 | 注释 |
---|---|---|
1 | $GLOBALS | $GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。 |
2 | $_SERVER | 这种超全局变量保存关于报头、路径和脚本位置的信息。 |
3 | $_REQUEST | 用于收集 HTML 表单提交的数据。 |
4 | $_POST | 广泛用于收集提交 method=”post” 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。 |
5 | $_GET | 可用于收集提交 HTML 表单 (method=”get”) 之后的表单数据。也可以收集 URL 中的发送的数据。 |
6 | $_FILES | 超全局变量 |
7 | $_ENV | 超全局变量 |
8 | $_COOKIE | 超全局变量 |
9 | $_SESSION | 超全局变量 |
常量的定义:
- 常量是单个值的标识符(名称)。在脚本中无法改变该值。
- 有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。
- 常量必须初始化
- 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
- 常量在整个脚本中都可以使用,不受作用域限制,属全局变量
- 定义常量有2种方式:
使用const关键字
使用define()函数- 常量除了用户自定义以外,还有预定义常量和魔术常量
代码示例:
<?php
// 自定义常量
// 1.查看当前有那些常量
//print_r(get_defined_constants(true));//true为参数分类
// 2.查询用户自定义常量
// print_r(get_defined_constants(true)['user']);
// 3. 2种方式创建常量
// 使用关键字const定义常量
const WEATHER = 'sony';
// 使用define()函数定义常量
define('SMOKE','相机');
echo '<pre>'.print_r((get_defined_constants(true)['user']),true).'</pre>';
echo '<hr>';
//类中的常量只能用const定义
class Body
{
// define('header','head');会报错
const FOOTER = 'foot';
}
echo Body::FOOTER,'<hr>';
// 有时会用到constant('常量名')的方式来输出常量
echo constant('SMOKE'),'<hr>';
// 定义一个特殊常量
// 这个案例可以看出使用常量名的方式不一定能获取到常量值
define('','pink');
echo '','<hr>';//输出为空
echo constant('');
浏览器演示:
当前有那些变量:(只是一部分,可print_r(get_defined_constants(true));//true为参数分类,自行查询)
序号 | 代码 | 注释 |
---|---|---|
1 | PHP_VERSION |
版本号 |
2 | PHP_OS_FAMILY |
操作系统 |
3 | PHP_INT_MAX |
最大整数 |
4 | PHP_FLOAT_MAX |
最大浮点数 |
5 | DIRECTORY_SEPARATOR |
目录分隔符 |
序号 | 代码 | 注释 |
---|---|---|
1 | __LINE__ |
文件中的当前行号 |
2 | __FILE__ |
文件的完整路径和文件名 |
3 | __DIR__ |
文件所在目录 |
4 | __FUNCTION__ |
当前的函数名称 |
5 | __CLASS__ |
当前类名称 |
6 | __TRAIT__ |
当前Trait名称 |
7 | __METHOD__ |
当前类方法名称 |
8 | __NAMESPACE__ |
当前命名空间名称 |
图片示例:
使用命名空间的原因:我们知道常量是全局作用域的,其实,还有函数,类,接口也是全局的,这些全局成员有一个共同点就是不能重复定义,但是在实际开发中,可能不得不需要用到同一个名字,这样就会有命名冲突的问题,而命名空间namespace,就是来解决这一问题的。
代码示例:
<?php
//常量的命名空间
// namespace命名空间代码段需要放在所有代码的第一行
// 下面展示案例二的时候先把案例一注释
// 示例一
// const NAME = 'jeak';
// const NAME = 'theshk'; // 这一行会报错,因为命名冲突
// echo NAME;
// echo '<hr>';
// 示例二:使用命名空间
namespace ns1{
const USER = '张三';
}
namespace ns2{
const USER = '李四';
}
// 访问时在全局空间里面访问
namespace {
echo \ns1\USER,'<br>';
echo \ns2\USER;
}
图片演示:
介绍:
过滤器可以处理变量(就是模板index.html中的{{param}}),把原始的变量经过处理后再展示出来,作用的对象是变量
查看当前PHP版本支持的预定义过滤器有那些:
foreach(filter_list() as $filter){
echo $filter.'=>'.filter_id($filter).'<br>';
}
图片示例:
代码示例:
<?php
// 变量过滤器
// 1. 过滤单个变量 filter_var()
// $age = 30;
$age = '130';
$age = '50';
// $age = 'abc';
// filter_var(要过滤的变量, 过滤器常量)
$options = ['options'=>['min_range'=> 18, 'max_range'=> 60]];//设置范围限定
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options));
echo '<hr>';
$email = 'admin@php.cn';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
echo '<hr>';
var_dump(filter_var($email, 274));、//采用过滤器id效果相同
图片示例:
代码示例:
<?php
// 变量过滤器
// 2. 验证多个变量 filter_var_array()
$a = 10;
$b = '90';
$arr = [$a, $b];
var_dump(filter_var_array($arr, FILTER_VALIDATE_INT));
echo '<hr>';
图片示例:
代码示例:
<?php
// 变量过滤器
//3. 外部变量
//通常通过 http请求发送过来的,表单,get,post
//使用GET参数来演示外部变量的获取与验证/过滤
//filter_input(输入类型get/post, 变量名, 过滤器, 参数)
echo 'id = ' .$_GET['id'];
$options = ['options'=>['min_range'=> 1]];
var_dump(filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, $options));
echo '<hr>';
// 同时验证多个外部变量
$args = [
'username'=> FILTER_SANITIZE_STRING,
'email'=>FILTER_VALIDATE_EMAIL,
'age'=> ['filter'=>FILTER_VALIDATE_INT, 'options'=>['min_range'=> 18, 'max_range'=> 60]],
'blog'=> FILTER_VALIDATE_URL
];
var_dump(filter_input_array(INPUT_GET, $args));
图片示例:
1.PHP 过滤器用于对来自非安全来源的外部数据(比如用户输入)进行验证和过滤。
外部数据来源:
序号 | 数据来源 | 描述 |
---|---|---|
1 | 表单 | 来自表音的用户输入数据 |
2 | Cookies | 来自浏览器中的 cookie |
3 | 服务器变量 | 防止伪装的合法访问 |
4 | Web 服务数据 | Web 请求的数据 |
5 | 数据库查询结果 | 数据表中的数据并不可信 |
2.常用的过滤器函数
序号 | 函数 | 描述 |
---|---|---|
1 | filter_list() |
返回一个当前版本支持的所有过滤器的数组 |
2 | filter_id() |
返回当前过滤器的id号 |
3 | filter_var() |
过滤单个变量 |
4 | filter_var_array() |
过滤多个变量 |
5 | filter_has_var() |
检测是否存在某个外部变量 |
6 | filter_input() |
过滤单个外部变量 |
7 | filter_input_array() |
过滤多个外部变量 |
INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
, INPUT_ENV
3.验证过滤器常量
序号 | 过滤器函数 | 描述 |
---|---|---|
1 | FILTER_VALIDATE_INT |
验证整数 |
2 | FILTER_VALIDATE_FLOAT |
浮点点验证 |
3 | FILTER_VALIDATE_BOOLEAN |
验证布尔项 |
4 | FILTER_VALIDATE_EMAIL |
验证邮箱 |
5 | FILTER_VALIDATE_URL |
验证 URL 地址 |
6 | FILTER_VALIDATE_IP |
验证 IP 地址 |
7 | FILTER_VALIDATE_REGEXP |
正则验证 |
FILTER_VALIDATE_BOOLEAN
: 布尔选项的返回值类型序号 | 返回值 | 描述 |
---|---|---|
1 | true |
“1”, “true”, “on” 和 “yes” |
2 | false |
“0”, “false”, “off”, “no”, “” |
3 | null |
除以上情形外 |
4.清理过滤器常量
序号 | 过滤器函数 | 描述 |
---|---|---|
1 | FILTER_UNSAFE_RAW |
保持原始数据 |
2 | FILTER CALLBACK |
自定义函数过滤数据 |
3 | FILTER_SANITIZE_STRING |
去除标签以及特殊字符:strip_tags() |
4 | FILTER_SANITIZE_STRIPPED |
“string” 过滤器别名 |
5 | FILTER_SANITIZE_ENCODED |
URL-encode 字符串,去除或编码特殊字符 |
6 | FILTER_SANITIZE_SPECIAL_CHARS |
HTML 转义字符, 等价于 htmlspecialchars() |
7 | FILTER_SANITIZE_EMAIL |
仅保留邮箱地址的合法字符 |
8 | FILTER_SANITIZE_URL |
仅保留合法的 URL, 必须从协议开始http/https |
9 | FILTER_SANITIZE_NUMBER_INT |
仅保留合法的数字和正负号+- |
10 | FILTER_SANITIZE_NUMBER_FLOAT |
仅保留合法的数字和正负号+- 以及指数 .,eE |
11 | FILTER_SANITIZE_MAGIC_QUOTES |
等价于函数: addslashes() |