PHP基础2
1、作用域
- 变量作用域,也叫”变量范围”, 即定义变量时的上下文环境
- 变量作用域,通俗的说,就是变量的生效范围
- 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
- 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
- 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
| 序号 |
作用域 |
描述 |
| 1 |
函数作用域 |
使用function关键字创建的作用域 |
| 2 |
全局作用域 |
函数之外的变量生效范围 |
- php 中没有块作用域的概念, 这与其它编程语言不同, 请留意
- 根据作用域不同, 变量可以分为三类:
| 序号 |
变量类型 |
描述 |
| 1 |
私有变量 |
函数中定义的变量 |
| 2 |
全局变量 |
函数之外定义的变量 |
| 3 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
- 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
| 序号 |
变量名 |
描述 |
| 1 |
$GLOBALS |
引用全局作用域中可用的全部变量 |
| 2 |
$_SERVER |
服务器和执行环境信息 |
| 3 |
$_GET |
HTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组 |
| 4 |
$_POST |
HTTP POST 请求: 将变量以关联数组形式传入当前脚本 |
| 5 |
$_FILES |
HTTP 文件上传变量,保存着上传文件的全部信息 |
| 6 |
$_COOKIE |
通过 HTTP Cookies 方式传递给当前脚本的变量的数组 |
| 7 |
$_SESSION |
当前脚本可用 SESSION 变量的数组 |
| 8 |
$_REQUEST |
默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组 |
| 9 |
$_ENV |
通过环境方式传递给当前脚本的变量的数组 |
<?php// 超全局变量不需要定义,不需要初始化// $GLOBALS = ....;;# 变量作用域// 全局作用域$siteName = 'php中文网';// 全局变量会自动注册也为超全局变量数组$GlOBALS的一个值// 超全局变量不受作用域限制// print_r($GLOBALS['siteName']);// 声明函数: 同时也创建一个函数作用域function getInfo() : string{ // 定义了一个函数"私有变量" // 1. 方法1: global // global $siteName; // 2. 使用超全局变量 $private = $GLOBALS['siteName']; // 函数中可以直接访问超全局变量 echo $_SERVER['SCRIPT_NAME']. '<br>'; return $private;}echo getInfo();echo $_SERVER['SCRIPT_NAME']. '<br>';
2. 静态变量
2.1 基本常识
- 定义在函数中的静态变量使用
static修饰,并且与函数作用域绑定 - 静态变量定义时必须初始化,且只能初始化一次,默认为
0 - 当程序执行离开函数作用域后,静态变量的值不丢失
- 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 函数中静态变量遵循私有变量约束, 全局不可访问
2.2 应用场景
- 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
- 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
namespace ns3;function test1(): float { // 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了 // 静态变量,可以理解为在函数中的"伪全局变量" // 实现函数在多次调用的过程中共享数据 static $sum = 0; $sum = $sum + 1; return $sum;}echo test1(), '<br>'; //1echo test1(), '<br>'; //2echo test1(), '<br>'; //3echo '<hr>';
3、变量过滤器
<?php# 变量过滤器// foreach (filter_list() as $filter) {// echo $filter . ' => ' . filter_id($filter) . '<br>';// }// echo '<hr>';// 1. 过滤单个变量filter_var()// 年龄$age = 30;$age = '30';$age = 68;var_dump(filter_var($age, FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>60]]));echo '<hr>';$email = 'admin@php.cn';$email = 'admin@';var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));var_dump(filter_var($email, 274));echo '<hr>';// 2. 过滤单个变量filter_var_array()var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));echo '<hr>';// 3. 检测是否存在指定的外部变量, filter_has_var()// 对于URL中的查询字符串: 在URL地址?后面的键值对// php.cn/index.php?// id=10// name=admin// INPUT_GET: 表示要检测的是$_GET,就是get参数,其实就是get请求// INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENVvar_dump(filter_has_var(INPUT_GET, 'page'));echo '<hr>';echo 'get变量p = ' . $_GET['p'];echo '<hr>';// 4. 访问外部变量的过滤器,filter_inputvar_dump(filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]));// echo filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]) ? '页码OK': '页码非法';// 5. 同时验证多个外部变量: filter_input_array()echo '<hr>';$args = [ 'username' => FILTER_SANITIZE_STRING, 'email' => FILTER_VALIDATE_EMAIL, 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]], 'blog' => FILTER_VALIDATE_URL,];// 标量:单值变量, 字符串, 布尔, 数值, // 复合: 对象, 数组var_dump(filter_input_array(INPUT_GET, $args));
4、常量
4.1 特征
| 序号 |
特征 |
| 1 |
常量前面没有美元符号$ |
| 2 |
常量创建时必须初始化 |
| 3 |
常量禁止更新和删除 |
| 4 |
常量不受作用域限制 |
| 5 |
推荐使用大写字母加下划线命名 |
<?php// 常量是代码中不需要更新的数据// 查看一下当前系统中有哪些常量// print_r(get_defined_constants());// 分组查看// print_r(get_defined_constants(true));define('APP_PATH', __DIR__ . '/app/admin');echo APP_PATH;
4.2 函数/关键字
| 序号 |
定义方式 |
描述 |
| 1 |
get_defined_constants() |
查看系统所有常量 |
| 2 |
defined() |
检测常量是否存在 |
| 3 |
define() |
创建常量 |
| 4 |
const 关键字 |
创建常量 |
| 5 |
constant() |
获取常量值 |
get_defined_constants(true): 常量分组打印,自定义常量在user分组defined(): 返回布尔值
<?php# 定义常量// define()函数define('LECTURE', '朱老师');// const 关键字const COURSE = 'PHP';// 常量不受作用域限制function test1(){ echo LECTURE . '教: ' . COURSE . '<br>'; define('SEX', '男'); echo SEX . '<br>'; // const不能用在函数中 // const AGE = 30; // echo AGE;}test1();echo '<hr>';// 流程控制中,define能用, const不能用if (true) { define('EMAIL', 'admin@php.cn'); // const EMAIL = 'admin@php.cn'; // echo EMAIL;}// const用在类中,创建类常量class Demo{ const HELLO = 'php.cn'; // define('A', 100);}echo Demo::HELLO.'<br>';// echo Demo::A.'<br>';// 常量通常只允许用标量进行初始化// 标量: 单值变量, 字符串, 数值,布尔, null// php7.0+支持数组初始化常量const DB_LINKS = [ 'host'=>'localhost', 'username'=>'root', 'password'=>'root', 'charset'=>'utf8',];echo '<pre>'.print_r(DB_LINKS,true).'</pre>';// constant()echo constant('LECTURE'). '<br>';echo LECTURE. '<br>';$constantName = 'EMAIL';echo constant($constantName);echo '<hr>';define('USER_NAME', '其实我也是一个常量');define('', '其实我也是一个常量');echo '';echo constant('');
4.3 预定义常量
预定义常量非常多,有许多与具体扩展相关,如 PDO, 这里仅列出系统级常用的:
| 序号 |
预定义常量 |
描述 |
| 1 |
PHP_VERSION |
PHP 版本 |
| 2 |
PHP_MAXPATHLEN |
PHP 路径最大长度:1024 |
| 3 |
PHP_OS_FAMILY |
操作系统:Windows/Darwin/Linux |
| 4 |
PHP_SAPI |
web 服务器与 php 之间接口: apache2handler |
| 5 |
PHP_EOL |
行尾结束符 |
| 6 |
PHP_INT_MAX |
最大整数: 9223372036854775807 |
| 7 |
PHP_INT_MIN |
最小整数: -9223372036854775808 |
| 8 |
PHP_INT_SIZE |
整数宽度: 8 |
| 9 |
PHP_FLOAT_MAX |
最大浮点数:1.7976931348623E+308 |
| 10 |
PHP_FLOAT_MIN |
整小浮点数: 2.2250738585072E-308 |
| 11 |
DEFAULT_INCLUDE_PATH |
默认 PHP 命令路径 |
| 12 |
PHP_EXTENSION_DIR |
默认 PHP 扩展路径 |
| 13 |
E_ERROR |
运行时错误: 致命中断 |
| 14 |
E_PARSE |
语法解析错误: 致命中断 |
| 15 |
E_NOTICE |
运行时提示: 不中断 |
| 16 |
E_WARNING |
运行时警告: 不中断 |
| 17 |
E_ALL |
所有级别错误(除E_STRICT) |
| 18 |
E_STRICT |
更加严格的错误处理机制,高于E_ALL |
| 19 |
TRUE |
布尔真 |
| 20 |
FALSE |
布尔假 |
| 21 |
NULL |
空 |
| 22 |
DIRECTORY_SEPARATOR |
目录分隔符 |
更多预定义常量:https://www.php.net/manual/zh/reserved.constants.php
4.4 魔术常量
- 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
- 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
| 序号 |
魔术常量 |
描述 |
| 1 |
__LINE__ |
文件中的当前行号 |
| 2 |
__FILE__ |
文件的完整路径和文件名 |
| 3 |
__DIR__ |
文件所在目录 |
| 4 |
__FUNCTION__ |
当前的函数名称 |
| 5 |
__CLASS__ |
当前类名称 |
| 6 |
__TRAIT__ |
当前Trait名称 |
| 7 |
__METHOD__ |
当前类方法名称 |
| 8 |
__NAMESPACE__ |
当前命名空间名称 |
<?php# 魔术常量echo '当前行号: ' . __LINE__ . '<br>';echo '当前文件: ' . __FILE__ . '<br>';echo '当前目录: ' . __DIR__ . '\demo6.php<br>';function hello123(){ echo __FUNCTION__;}hello123();echo '<hr>';class D{ public function index() { echo __METHOD__; }}(new D)->index();
5、总结
这节课的主要收获就是变量过滤器,虽然过滤数据有很多种方法,但是多掌握一种也不错。常量可以用数组初始化这个我以前也不知道。
批改老师:
天蓬老师
批改状态:合格
老师批语:不知常量可以使用数组, 说明你没有关注过php7.0+新特征, 以后要好好听课, 咱们后面的php7.0+的内容还多着呢