批改状态:合格
老师批语:#声明变量 $var = 'email'; $$var = 456; #输出 结果 echo $emali; //456 变量名都错了, 细心点
| 概念 | 描述 |
|---|---|
| 临时存储数据的空间 | 并不是所有的数据都要保存到文件中,对于只适用于当前程序的数据用变量更合适 |
| 数据的复用手段 | 将程序需要反复调用的数据,保存到一个变量中实现数据的复用 |
| 规则 | 描述 |
|---|---|
| 语法 | $+标识符(必须以\$作为变量标志) |
| 标识符 | 只允许使用大小写字母、数字、下划线,且不允许以数字开头 |
| 大小写敏感 | 严格区分大小写$name跟$NAME是两个不同的变量 |
| 无意义变量名 | 如$_ $aaa $_123,有效但无意义 |
变量名要做到望名生义,一个有意义的变量名,可以极大地提高代码可读性,以及后期维护方便
推荐一个变量命名网站,告别命名恐惧症:[https://unbug.github.io/codelf/]
php 是动态语言,所以他的类型,值,变量名都是动态的
| 名称 | 描述 |
|---|---|
| 弱类型 | 变量的类型由他当前值决定 |
| 变量传递 | 变量的值来自另一个变量时,存在“值传递和引用传递两种” |
| 动态变量名 | 也叫“可变变量”,即变量标识符来自另一个变量的值 |
php 是弱类型语言,他的变量类型由赋给他的值决定
因此 php 变量不需要使用前进行声明
示例代码
//声明一个变量$var = 123;#打印var_dump($var);#输出#int(100)#当前他的变量类型为 int类型$var = 'hello word';#打印var_dump($var);#输出#string(11)"hello word"#当前他的变量类型为 string类型
将变量赋值给另一个变量时,有值传递和引用传递两种方式
| 传递方式 | 描述 |
|---|---|
| 值传递 | 将原变量的变量值复制到新变量中 |
| 引用传递 | 将原变量内存访问地址使用&引用 赋值给新变量 |
示例
#1.值传递$price1 = 123;$price2 = $price1;//输出 结果echo $price1 ; //123echo $price2 ; //123#更新 $price1$price1 = 456 ;//输出 结果echo $price1; //456echo $price2; //123#2.引用传递$price3 = 789;$price4 = &$price3;//输出 结果echo $price3 ; //789echo $price4 ; //789#更新price3$price3 = 369;//输出 结果echo $price3; //369echo $price4; //369
引用传递就相当于给原变量起一个别名。
可变变量:是指变量的标志符可以动态的改变,即变量标识符可以来自另外一个变量的值
应用场景: 需要通过动态改变变量来处理不同需求的时候,例如图像处理,请求处理时
演示代码
#声明变量$var = 'email';$$var = 456;#输出 结果echo $emali; //456
| 函数 | 描述 |
|---|---|
isset() |
检测变量是否存在且值非null |
unset() |
删除变量,销毁 |
empty() |
是否为空(""/0/'0'/null/false/[]/\$a) |
isnull() |
NULL:赋值为null/未赋值/unset() |
代码
#打开报错开关error_reporting(E_ALL);#打印值 结果echo $username; //报错:变量未定义// 所以在打印之前应该进行检测if(isset($username)){ //检测变量是否存在且值非nullecho $username; //如果存在,输出变量} else{echo '变量不存在'; //若不存在,输出不存在}//当前值不存在,输出为“变量不存在”#声明一个值$username = 123;//检测输出if(isset($username)){ //检测变量是否存在且值非nullecho $username; //如果存在,输出变量} else{echo '变量不存在'; //若不存在,输出不存在}//当前值存在 输出 123#销毁该值unset($username);//检测输出if(isset($username)){ //检测变量是否存在且值非null(空)echo $username; //如果存在,输出变量} else{echo '变量不存在'; //若不存在,输出不存在}// 当前值已被销毁(不存在) , 输出 变量不存在# 检测当前值是否为空 empty()//声明一个空值$username ;/* 以下声明与上面检测结果相同$username = 0 ;$username = '0';$username = null;$username = false;$username = [];*///检测输出if(empty($username)){ //检测是否为空echo '该值为空'; //若为空提示} else{echo $uesrname; //若不为空输出值}//当前值为空 输出 ’该值为空‘#声明值$username = 123;#再次检测if(empty($username)){ //检测是否为空echo '该值为空'; //若为空提示} else{echo $uesrname; //若不为空输出值}// 当前值不为空 输出 ’123‘#检测当前变量是否有值// 声明$username ;// 检测if(isnull($username)){ //检测是否存在值,echo '值不存在'; //不存在输出} else{echo '值存在' //存在输出}// 当前$username 没有值 输出 值不存在
变量的访问方式,受以下条件限制
| 名称 | 描述 |
|---|---|
| 数据类型 | 主要有基本类型,复用类型和特殊类型 |
| 作用域 | 变量的有效范围,即可见性,查询变量的工具 |
| 生命周期 | 变量从注册到注销的全过程(程序结束会自动注销) |
确定了数据类型,才可以确定数据的’取值范围‘与’操作方式‘,所以非常重要
变量的数据类型由值决定,值的数据类型有三类:基本类型,复合类型,特殊类型。
基本类型是构成符合类型的基本数据单元
| 序号 | 类型 | 标识符 | 检测函数 | 举例 |
|---|---|---|---|---|
| 1 | 整数 | integer |
is_int() |
150,999 |
| 2 | 浮点型 | float |
is_float() |
3.14,.315 |
| 3 | 字符 | string |
is_steing() |
''php 'email' |
| 4 | 布尔 | boolean |
is_bool() |
true , false |
| 类型 | 标识符 | 检测函数 | 举例 |
|---|---|---|---|
| 对象 | object |
is_object() |
new stdClass() |
| 数组 | array |
is_array() |
$arr = [1,2,3] |
| 类型 | 标识符 | 检测函数 | 举例 |
|---|---|---|---|
| 空 | null |
is_null() |
null |
| 资源 | rasource |
is_resource() |
$f = fopen(...) |
<?php# 变量类型// 基本类型$name = '手机';$price = 3890;$is5G = true;echo $name . '价格: ' . $price . ', 是否5G? ' . ($is5G ? '是' : '否') . '<br>';// 复合类型$obj = new stdClass;$obj->email = 'admin@php.cn';echo $obj->email, '<br>';$arr = ['电脑', 8000, 'huawei'];// print_r($arr);echo '<pre>' . print_r($arr, true) . '</pre>';// 特殊类型$num = null;var_dump($num);$f = fopen('demo6.php', 'r');var_dump($f);// gettype(): 返回类型字符串echo gettype($f);
类型检测函数,如is_int() 返回的都是一个布尔值
gettype():返回类型的字符串表示
自动转换:表达式根据操作符,将操作数组转为一致的数据类型后再进行运算
自动转换,通常只发生在基本类型 参与的算术或字符串运算中
| 类型 | 转换规则 |
|---|---|
null |
null => 0 |
boolean |
true => 1,false => 0 |
string |
123abc => 123,abc123 => 0 |
integer |
int => float |
强制转换分为:临时转换,永久转换
临时转换,可使用类型提示符,或者类型函数实现
使用类型提示符:
| 类型 | 转换规则 |
|---|---|
(int) |
转为整数 |
(float) |
转为浮点数 |
(string) |
转为字符串 |
(array) |
转为数组 |
(object) |
转为对象 |
使用类型函数:
| 类型 | 转换规则 |
|---|---|
intval() |
转为整数 |
floatval() |
转为浮点数 |
strval() |
转为字符串 |
boolval() |
转为布尔 |
settype($var , $type)示例代码
<?php# 变量类型转换// 自动转换$a = null;$b = true;$c = false;$d = '5g';$e = 'php';$f = 15;echo $a + 10, '<br>';echo $b + 10, '<br>';// 字符串转数值型会有警告,但代码仍会执行, 推荐使用强制转换echo $d + 10, '<br>';echo $e + 10, '<br>';// 整数15转为字符串'15'echo $e . $f;echo '<hr>';// 强制转换// 转换提示符: (int),(sgring)...// (int)将$d强制转为整数,不再有警告信息echo (int) $d + 10, '<br>';// intval()转整数echo intval($d) + 18, '<br>';// strval($f)转字符串echo strval($f) . ' hello', '<br>';// 以上通过提示符和函数完成的强制转换,并不改变变量原始类型// $f 依然是整数类型:integerecho gettype($f), '<br>';// settype()可将变量类型永久转换settype($f, 'string');// $f 永久的成为字符串类型echo gettype($f), '<br>';
变量作用域,也叫变量范围,即定义变量是的上下文环境
通俗的说就是变量的生效范围
一个变量必定属于一个作用域,这个作用域也包括了当前作用域中引入的其他文件
也有不受作用域限制的变量,例如超全局变量,在程序中的任何方都是有定义的
函数作用域:php 中只有函数可以创建作用域,函数之外的代码全部在全局空间中
| 作用域 | 描述 |
|---|---|
| 函作用域 | 使用function关键字创建的作用域 |
| 全局作用域 | 函数之外的变量生效范围 |
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 |
通过环境方式传递给当前脚本的变量的数组 |
示例代码
<?php# 变量类型转换// 自动转换$a = null;$b = true;$c = false;$d = '5g';$e = 'php';$f = 15;echo $a + 10, '<br>';echo $b + 10, '<br>';// 字符串转数值型会有警告,但代码仍会执行, 推荐使用强制转换echo $d + 10, '<br>';echo $e + 10, '<br>';// 整数15转为字符串'15'echo $e . $f;echo '<hr>';// 强制转换// 转换提示符: (int),(sgring)...// (int)将$d强制转为整数,不再有警告信息echo (int) $d + 10, '<br>';// intval()转整数echo intval($d) + 18, '<br>';// strval($f)转字符串echo strval($f) . ' hello', '<br>';// 以上通过提示符和函数完成的强制转换,并不改变变量原始类型// $f 依然是整数类型:integerecho gettype($f), '<br>';// settype()可将变量类型永久转换settype($f, 'string');// $f 永久的成为字符串类型echo gettype($f), '<br>';
static修饰,并且与函数作用域绑定-当程序执行离开函数作用域后,静态变量的值不丢失
静态变量的值,可以在函数中多次调用中保持不变,即可带入下次调用中
函数中静态变量遵循私有变量约束,全局不可访问
当多次调用同一个函数,且要求每次调用之间共享或保留某些变量的时候
尽管全局变量也可以做到,但没必要,采用局部静态变量更合适
代码
# 静态变量namespace ns1;function test1(): float{// $sum: 局部动态变量,每次调用都会初始化,无法在多次调用中保持不变$sum = 0;$sum = $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 = $sum + 1;return $sum;}echo test1(), '<br>';echo test1(), '<br>';echo test1(), '<br>';echo '<hr>';namespace ns3;function test1(): float{// 静态变量: 仅第一次调用时初始化,以后调用可保持原值// 静态变量: 可简单理解为仅在函数中使用的"伪全局变量"// 可以实现在函数的多次调用中的数据共享static $sum = 0;$sum = $sum + 1;return $sum;}echo test1(), '<br>';echo test1(), '<br>';echo test1(), '<br>';
PHP 过滤器用于验证和过滤来自非安全来源的外部数据
外部数据来源:
| 数据来源 | 描述 |
|---|---|
| 表单 | 来自表单的用户输入数据 |
| cookies | 来自浏览器的 cookie |
| 服务器变量 | 防止伪装的合法访问 |
| web 服务数据 | web 请求数据 |
| 数据库查询结果 | 数据表中的数据并不可信 |
| 函数 | 描述 |
|---|---|
filter_list() |
|
filter_id() |
|
filter_var() |
过滤单个变量 |
filter_var_array() |
过滤多个变量 |
filter_has_var() |
检测是否存在某个外部变量 |
filter_input() |
过滤单个外部变量 |
filter_input_array() |
过滤多个外部变量 |
外部变量类型:INPUT_GET INPUT_POST INPUT_COOKIE INPUT_SERVER INPUT_ENV
过滤器主要分为两类: 验证过滤器 清理过滤器
| 过滤器函数 | 描述 |
|---|---|
FILTER_VALIDATE_INT |
验证整数 |
FILTER_VALIDATE_FLOAT |
验证浮点 |
FILTER_VALIDATE_BOOLEAN |
验证布尔项 |
FILTER_VALIDATE_EMAIL |
验证邮箱 |
FILTER_VALIDATE_URL |
验证 URL 地址 |
FILTER_VALIDATE_IP |
验证 IP 地址 |
FILTER_VALIDATE_REGEXP |
正则验证 |
FILTER_VALIDATE_BOOLEAN: 布尔选项的返回值类型true | “1”, “true”, “on” 和 “yes” |false | “0”, “false”, “off”, “no”, “” |null | 除以上情形外 || 序号 | 过滤器函数 | 描述 |
|---|---|---|
| 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() |
'options'=>[...], 'flags'=>...(复数)
filter_var($int, FILTER_VALIDATE_INT, ['options'=>['min_range'=>10,'max_range'=>80]]);// FILTER_REQUIRE_SCALAR: 必须是标量(即单值数据,如字符串,数值,布尔, 不能是数组或对象)filter_var($data, FILTER_VALIDATE_EMAIL, ['flags'=>FILTER_REQUIRE_SCALAR]);
示例代码: demo11.php
# 变量过滤器// filter_list(): 查看支持的所有过滤器// filter_id(): 返回过滤器常量对应的IDforeach (filter_list() as $filter) {// echo $filter . ' => ' . filter_id($filter) . '<br>';}echo '<hr>';// 1. filter_var(): 过滤单个变量$age = 30;var_dump(filter_var($age, FILTER_VALIDATE_INT));// 验证时,会将变量值转为字符串类型, 所以这样写也对$age = '30';var_dump(filter_var($age, FILTER_VALIDATE_INT));echo '<br>';// 还可以添加第三个参数,对过滤器行为进行限定// 被过滤的数据也支持字面量,但不推荐这样var_dump(filter_var(10, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));$age = 40;var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));echo '<br>';// 既可以使用过滤器常量,也可以使用过滤器ID$email = 'admin@php.cn';// 过滤器常量var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));echo '<br>';// 过滤器IDvar_dump(filter_var($email, 274));echo '<br>';var_dump(filter_var('peter@qq.com', 274));echo '<br>';// 2. filter_var_array():过滤多个变量$a = 10;$b = 'php';// 返回值是数组, 验证失败返回false,成功返回原值var_dump(filter_var_array([$a, $b], FILTER_VALIDATE_INT));echo '<br>';// 对于多变量验证最好将数组放在数组中统一处理$data = [$a, $b, 'html', [6, 7, 8], 150, 200];var_dump(filter_var_array($data, FILTER_VALIDATE_INT));// 过滤掉验证未通过的元素var_dump(array_filter(filter_var_array($data, FILTER_VALIDATE_INT)));echo '<hr>';// 3. filter_has_var(): 检测是否存在指定类型的外部变量// 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENVvar_dump(filter_has_var(INPUT_GET, 'id'));echo '<br>';//4. filter_input(): 通过名称获取特定的外部变量,并且可以通过过滤器处理它// 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV// false:验证失败, null: 变量不存在, 成功返回当前值// $_GET['id'] 必须是大于1的整数$res = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);var_dump($res);echo '<hr>';// 5. filter_input_array(): 同时验证多个外部变量// 为一组数据应用统一过滤器var_dump(filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING));// 为每一个元素应用不同的过滤器// 设置变量对应过滤器$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,];// 非法: demo11.php?username=<a>admin</a>&email=abc&age=15&blog=blog.php.cn// 合法: demo11.php?username=admin&email=abc@qq.com&age=25&blog=http://blog.php.cnvar_dump(filter_input_array(INPUT_GET, $args));
未接触php之前,一直觉得php很难,接触之后发现也不是那么难,主要是要理解他的逻辑,但还是要保持敬畏之心。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号