1.变量和变量作用域
- 变量作用域和超全局变量
- 超全局变量无需定义
- 现在是全局作用域
序号 |
作用域 |
描述 |
1 |
函数作用域 |
使用function 关键字创建的作用域 |
2 |
全局作用域 |
函数之外的变量生效范围 |
- php 中没有块作用域的概念, 这与其它编程语言不同, 请留意
- 根据作用域不同, 变量可以分为三类:
序号 |
变量类型 |
描述 |
1 |
私有变量 |
函数中定义的变量 |
2 |
全局变量 |
函数之外定义的变量 |
3 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
$siteName='php中文网'//这是简单的变量赋值
序号 |
变量名 |
描述 |
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 |
通过环境方式传递给当前脚本的变量的数组 |
2.静态变量
- 定义在函数中的静态变量使用
static
修饰,并且与函数作用域绑定 - 静态变量定义时必须初始化,且只能初始化一次,默认为
0
- 当程序执行离开函数作用域后,静态变量的值不丢失
- 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 函数中静态变量遵循私有变量约束, 全局不可访问
应用场景
- 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
- 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
namespace ns1;
function tset1() {
// 私有变量也叫动态变量 每次调用他都会初始化
$sum =0;
$sum= $sum+1;
return $sum;
}
echo tset1(),'<br>';
echo tset1(),'<br>';
echo tset1(),'<br>';
echo tset1(),'<br>';
echo '<hr>';
//不同的目录下面有相同的文件名
namespace ns2;
function tset1() {
// 在函数中如果把私有变量变成全局变量那么函数的计算值会累加 所以说 全局变量是静态变量 但是页面中防止变量冲突 不能用来函数调用免得造成全局污染 所以在函数中要定义静态变量
//局部静态变量:只在函数第一次调用的时候被初始化,以后不会再被更新
static $sum=0;
$sum= $sum+1;
return $sum;
}
echo tset1(),'<br>';
echo tset1(),'<br>';
echo tset1(),'<br>';
echo tset1(),'<br>';
3.变量过滤器
变量过滤函数里面配置了很多的常量 :
- 1.FILTER_VALIDATE_INT 整数类型
- 2.FILTER_VALIDATE_EMAIL 验证邮箱类型
- 3.FILTER_SANITIZE_STRING 检测字符串类型;
- 4.FILTER_REQUIRE_SCALAR 单值变量
- 5.FILTER_VALIDATE_URL 检测url类型
变量过滤函数
- 1.filter_var() //过滤单个变量;
- 2.filter_var_array()过滤多个变量 也就是数组
- 3.filter_has_var() 检测是否 存在指定的外部变量 ;
- 4.filter_input()访问外部变量的过滤器;
//变量过滤器
//foreach () //遍历数组的
foreach (filter_list() as $filter){
echo $filter,'===>',filter_id($filter).'<br>';
}
//过滤单个变量是 filter_var
//年龄 整数类型的
$age=33;
$options=['options'=>["min_range"=>'18','max_range'=>'60']];
var_dump(filter_var($age,FILTER_VALIDATE_INT,$options));
//过滤邮箱
$email ='1@aa.cn';
var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
//过滤多个变量
var_dump(filter_var_array([$age,$email],FILTER_VALIDATE_INT));
//检测是否 存在指定的外部变量 filter_has_var();
//INPUT_GET ,INPUT_POST,INPUT_COOKIE,INPUT_SESSION,INPUT_ENV
filter_has_var(INPUT_GET,'P');
echo '<hr>';
//访问外部变量的过滤器
$options=['options'=>["min_range"=>'1']];
var_dump(filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,$options));
echo filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,$options)?'321':'123';
//同事验证多个外部变量 filter_var_array 就是提交过来的 接受方式用get
echo '<hr>';
$args=[
'username'=>FILTER_SANITIZE_STRING,
'email'=>FILTER_VALIDATE_EMAIL,
'age'=>[
'filter'=>FILTER_VALIDATE_INT,
'flags'=>FILTER_REQUIRE_SCALAR,//单值变量
'options'=> ['min_range'=>14, 'max_range'=>18],
'blog'=>FILTER_VALIDATE_URL,
]
];
var_dump(filter_input_array(INPUT_GET,$args));
常量
1. 特征
序号 |
特征 |
1 |
常量前面没有美元符号$ |
2 |
常量创建时必须初始化 |
3 |
常量禁止更新和删除 |
4 |
常量不受作用域限制 |
5 |
推荐使用大写字母加下划线命名 |
2. 函数/关键字
序号 |
定义方式 |
描述 |
1 |
get_defined_constants() |
查看系统所有常量 |
2 |
defined() |
检测常量是否存在 |
3 |
define() |
创建常量 |
4 |
const 关键字 |
创建常量 |
5 |
constant() |
获取常量值 |
get_defined_constants(true)
: 常量分组打印,自定义常量在user
分组defined()
: 返回布尔值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
系统中的常量
//print_r(get_defined_constants(true));
//[Core]分组常量 [filter] 过滤器常量 [hash]哈希常量 [json]json常量 加true 就是分组查看
//常量只允许用标量来初始化 标量是 :字符串 数值布尔 null
//php7+中常量可以赋值 数组
//print_r(get_defined_constants(true));
自定义常量
//这个函数是检测常量在不在
define('APP_PATH',__DIR__.'/app/admin');
定义常量
- 1常量有两种定义方式
- 1.1.define(‘SHOP’,’买她’);
- 1.2.const SHOPS = ‘买她’;
- 2.常量不受作用域限制
- 3.用函数创建常量是可以的不能用const()
- 4.流程控制中define()能用 ,const不能
- 5.const 可以用在类中创建一个类常量 类中 不能用define();
- 6.常量数组的形式 //php7+中常量可以赋值 数组
- 7.constant(‘’)//如果定义一个常量的名字为空他其实也是常量 但是打印的时候用echo 肯定打印不出来所要用constant();
define('SHOP','买她');
//常量不能反复定义
const SHOPS = '买她';
//常量不受作用域限制
//用函数创建常量是可以的不能用const
function shop(){
echo SHOPS;
echo '<hr>';
}
//shop();
//流程控制中define能用 ,const不能
if (true){
define("COOKIE",'油炸鬼');
// const FOOT='脚';
echo COOKIE;
echo '<hr>';
}
//const 可以用在类中创建一个类常量 类中 不能用define();
class demo{
const DEMO='新的';
}
echo demo::DEMO,'<hr>';
/常量数组的形式
const DB_LINKS = [
'host'=>'127.0.0.1',
'username'=>'root',
'password'=>'password',
];
print_r(DB_LINKS, '<hr>');
//常量的特殊情况
//如果定义一个常量的名字为空他其实也是常量 但是打印的时候用echo 肯定打印不出来所要用constant();
define('USER_NAME','我是常量');
define('','我是常量');
echo '';//这样是打印不出来的
echo constant('');//这样是可以的
echo PHP_VERSION;
魔术常量
- 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
- 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
序号 |
魔术常量 |
描述 |
1 |
__LINE__ |
文件中的当前行号 |
2 |
__FILE__ |
文件的完整路径和文件名 |
3 |
__DIR__ |
文件所在目录 |
4 |
__FUNCTION__ |
当前的函数名称 |
5 |
__CLASS__ |
当前类名称 |
6 |
__TRAIT__ |
当前Trait 名称 |
7 |
__METHOD__ |
当前类方法名称 |
8 |
__NAMESPACE__ |
当前命名空间名称 |
echo '当前行号'.__LINE__.'<br>';
echo '当前文件'.__FILE__.'<br>';
echo '当前目录'.__DIR__.'<br>';
function name(){
echo '当前方法名'.__FUNCTION__.'<br>';
}
name();
class xinde{
function index(){
echo '当前方法名'.__CLASS__.'<br>';
}
}
(new xinde)->index();