变量
1.作用域
- 变量作用域,也叫“变量范围”,即定义变量时的上下文环境
- 变量作用域,通俗的说,就是变量的生效范围
- 一个变量必定属于一个作用域,这个作用域也包括了当前作用域中引入其他文件
- 也有不受作用域限制的变量,例如超全局变量,在程序中任何地方都是有定义的
- 函数作用域:php中只有函数可以创建作用域,函数之外的代码全部在全局空间中
作用域 |
描述 |
函数作用域 |
使用function 关键字创建的作用域 |
全局作用域 |
函数之外的变量生效范围 |
- php中没有块级作用域的概念,这与其他编程语言不同。
- 根据作用域不同,变量可以分为三类
变量类型 |
描述 |
私有变量 |
函数中定义的变量 |
全局变量 |
函数之外定义的变量 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
- 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
|变量名|描述|
|$GLOBALS
|引用全局域中可用的全部变量|
|$_SERVER
|服务器和执行环境信息|
|$_GET
|http get 请求:通过url参数传递给当前脚本的变量的数组|
|$_POST
|HTTP POST 请求:将变量以关联数组形式传入当前脚本|
|$_FILES
|HTTP 文件上传变量,保存着上传文件的全部信息|
|$_COOKIE
|通过HTTP Cookies方式传递给当前脚本的变量的数组|
|$_SESSION
|当前脚本可用SESSION变量的数组|
|$_REQUEST
|默认情况下包含了 $_GET
,$_POST
和 $_COOKIE
的数组|
|$_ENV
|通过换届方式传递给当前脚本的变量的数组|
<?php
//超全局变量不需要定义,不需要初始化
//$GLOBALS = .....;;
# 变量作用域
//全局作用域
$siteName = 'php中文网';
// 全局变量会自动注册也为超全局变量数组$GlOBALS的一个值
// 超全局变量不受作用域限制
print_r($GLOBALS['siteName']);
// 声明函数: 同时也创建一个函数作用域
function getInfo1(): string
{
//定义了一个函数“私有变量”
// 方法1:global
global $siteName;
$private = $siteName;
return $private;
}
echo getInfo1();
function getInfo2(): string
{
// 2. 使用超全局变量
$private = $GLOBALS['siteName'];
// 函数中可以直接访问超全局变量
return $private;
}
echo getInfo2();
//返回当前文件名称
echo $_SERVER['SCRIPT_NAME'] . '<br>';
?>
- 预览效果
8. 静态变量
8.1 基本常识
- 定义在函数中的静态变量使用
static
修饰,并且与函数作用域绑定 - 静态变量定义时必须初始化,且只能初始化一次,默认为
0
- 当程序执行离开函数作用域后,静态变量的值不丢失
- 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 函数中静态变量遵循私有变量约束, 全局不可访问
8.2 应用场景
- 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
- 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
<?php
# 静态变量
namespace ns1;
function test1(): float
{
//私有变量,也叫动态变量,在函数中每一次都会自动初始化
//并且无法在多次调用过程中保持不变
$sum = 0;
$sum += 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
//命名空间
//不同的目录下面可以有相同的文件名
namespace ns2;
//全局变量
$sum = 0;
function test1(): float
{
global $sum;
$sum += 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
namespace ns3;
function test1(): float
{
// 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了
// 静态变量,可以理解为在函数中的"伪全局变量"
// 实现函数在多次调用的过程中共享数据
static $sum = 0;
$sum += 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
$num = 2;
// 变量的本质是数据共享
// 函数的本质是代码共享
echo $num1 + 1;
echo '<br>';
echo $num1 + 5;
echo '<br>';
echo $num1 + 8;
?>
- 效果
变量过滤器
<?php
# 变量过滤器
foreach (filter_list() as $filter) {
echo $filter . '=>' . filter_id($filter) . '<br>';
}
echo '<hr>';
?>
- 预览效果
<?php
# 变量过滤器
//1.过滤单个变量filter_var()
//过滤年龄
$age = 30; //返回值int(30)
$age = 12; //返回值 bool(flase)
$age = 69; //返回值 bool(flase)
var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 68]]));
echo '<hr>';
$email = 'admin@php.cn';
$email = 'admin@'; //返回值 bool(flase)
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)); //[返回int(100),返回bool(false);]
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_ENV
var_dump(filter_has_var(INPUT_GET, 'page')); //存在返回ture
var_dump(filter_has_var(INPUT_GET, 'p')); // 不存在返回flase
echo '<hr>';
echo 'get变量p=' . $_GET['page']; // 获取外部变量值
echo '<hr>';
// 4. 访问外部变量的过滤器,filter_input
var_dump(filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]));
// 5.同时验证多个外部变量:filter_input_array()
echo '<hr>';
$a = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
// 'flags'=>FILTER_REQUIRE_SCALAR,限制标量
'age' => ['filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
'blog' => FILTER_VALIDATE_URL,
];
// 标量:单值变量, 字符串, 布尔, 数值,
// 复合: 对象, 数组
var_dump(filter_input_array(INPUT_GET, $a));
?>
- 效果
常量
1. 特征
特征 |
常量前面没有美元符号$ |
常量创建时必须初始化 |
常量禁止更新和删除 |
常量不受作用域限制 |
推荐使用大写字母加下划线命名 |
2. 函数/关键字
定义方式 |
描述 |
get_defined_constants() |
查看系统所有常量 |
defined() |
检测常量是否存在 |
define() |
创建常量 |
const 关键字 |
创建常量 |
constant() |
获取常量值 |
get_defined_constants(true)
: 常量分组打印,自定义常量在user
分组defined()
: 返回布尔值
3. 预定义常量
预定义常量非常多,有许多与具体扩展相关,如 PDO
, 这里仅列出系统级常用的:
预定义常量 |
描述 |
PHP_VERSION |
PHP 版本 |
PHP_MAXPATHLEN |
PHP 路径最大长度:1024 |
PHP_OS_FAMILY |
操作系统:Windows/Darwin/Linux |
PHP_SAPI |
web 服务器与 php 之间接口: apache2handler |
PHP_EOL |
行尾结束符 |
PHP_INT_MAX |
最大整数: 9223372036854775807 |
PHP_INT_MIN |
最小整数: -9223372036854775808 |
PHP_INT_SIZE |
整数宽度: 8 |
PHP_FLOAT_MAX |
最大浮点数:1.7976931348623E+308 |
PHP_FLOAT_MIN |
整小浮点数: 2.2250738585072E-308 |
DEFAULT_INCLUDE_PATH |
默认 PHP 命令路径 |
PHP_EXTENSION_DIR |
默认 PHP 扩展路径 |
E_ERROR |
运行时错误: 致命中断 |
E_PARSE |
语法解析错误: 致命中断 |
E_NOTICE |
运行时提示: 不中断 |
E_WARNING |
运行时警告: 不中断 |
E_ALL |
所有级别错误(除E_STRICT ) |
E_STRICT |
更加严格的错误处理机制,高于E_ALL |
TRUE |
布尔真 |
FALSE |
布尔假 |
NULL |
空 |
DIRECTORY_SEPARATOR |
目录分隔符 |
<?php
#定义常量
//define()函数
define('TEACHER', '老师');
//conts 关键字
const COURSE = 'php';
//常量不受作用域限制
function test1()
{
echo TEACHER . '教:' . 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;
}
echo '<hr>';
//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',
'name' => 'root',
'password' => 'root',
'charset' => 'utf-8',
];
echo '<pre>' . print_r(DB_LINKS, true) . '</pre>';
//constant()
echo constant('TEACHER') . '<br>';
echo TEACHER . '<br>';
$constantName = 'EMAIL';
echo constant($constantName);
echo '<hr>';
define('USER_NAME', '其实我是一个常量');
echo USER_NAME;
define('', '其实我是一个常量2');
echo constant('');
4. 魔术常量
- 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
- 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
魔术常量 |
描述 |
__LINE__ |
文件中的当前行号 |
__FILE__ |
文件的完整路径和文件名 |
__DIR__ |
文件所在目录 |
__FUNCTION__ |
当前的函数名称 |
__CLASS__ |
当前类名称 |
__TRAIT__ |
当前Trait 名称 |
__METHOD__ |
当前类方法名称 |
__NAMESPACE__ |
当前命名空间名称 |
<?php
#魔术常量
echo '当前行号:' . __LINE__ . '<BR>';
echo '当前文件:' . __FILE__ . '<BR>';
echo '当前目录:' . __DIR__ . '<BR>';
// 当前的函数名称
function hello123()
{
echo __FUNCTION__;
}
hello123();
echo '<hr>';
// 当前类方法名称
class D
{
public function index()
{
echo __METHOD__;
}
}
(new D)->index();
总结
- php 常量的特征,函数,预定义常量,魔术常量的使用方法
- 变量的作用域的类型等
- 静态变量的常识,和应用场景