变量是临时存储数据的容器,是实现数据服用的手段。变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制。变量必须以$
作为开始,变量名区分大小写
常量创建必须给定一个值,一旦被定义就无法再更改,通常用大写表示。常量不受作用域限制
变量名必须以$
作为开始,不允许使用特殊字符,数字作为变量的开始,必须使用字母或下划线开始,后面允许使用数字
常量的创建分为两种:关键字 const
创建,define()
函数创建,在类中,类的常量只能用 const
创建
//变量
$str = '这是一个变量';
//常量,一旦定义就无法更改
const APP_NAME = 'demo';
define('APP_ID', 110);
class Demo {
const CLASS_NAME = 'Demo';
}
$name = 'APP_NAME';
变量和常量都可以使用 echo 直接输出 echo 没有返回值,效率最高,常量的变量化,只能使用constant()
函数来获取
//输出变量$a
echo $str;
echo '<br>'; //换行
//访问常量
echo APP_NAME;
echo '<br>';
echo APP_ID;
echo '<br>';
//访问类中的常量
echo Demo::CLASS_NAME;
// 常量名的变量化,只能使用函数来获取
echo constant($name);
代码执行结果如下:
变量过滤器的常用函数主要有:
filter_list()
用来获取过滤器名称filter_id()
用来获取过滤器 ID,参数是过滤器名称fliter_var()
filter_var_array()
分别用来过滤单个和多个变量filter_has_var()
用于检测是否存在某个外部变量filter_input()
filter_input_array()
分别用于过滤单个和多个外部变量INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
, INPUT_ENV
//1.返回过滤器的名称
echo '<hr>';
echo '<pre>';
print_r(filter_list());
//2.返回过滤器的ID filter_id(过滤器的名称)
echo '<hr>';
var_dump(filter_id('validate_email'));
echo "<br>";
var_dump(filter_id('int'));
echo '</pre>';
// 3.过滤单个变量 filter_var()
echo '<hr>';
// 在验证范围内的变量
$num1 = 88;
// 在验证范围外的变量
$num2 = 101;
$option = ['options' => ['min_range' => 1,'max_range' => 100]];
var_dump(filter_var($num1 , FILTER_VALIDATE_INT,$option));
echo "<br>";
var_dump(filter_var($num2 , FILTER_VALIDATE_INT,$option));
echo '<hr>';
//4.过滤多个变量
//不符合验证规则变量
$var1 = 100;
$var2 = 'abc';
//符合验证规则变量
$var3 = 666;
$var4 = 888;
//验证不通过将返回false
var_dump(filter_var_array([$var1,$var2],FILTER_VALIDATE_INT));
echo "<br>";
var_dump(filter_var_array([$var3,$var4],FILTER_VALIDATE_INT));
echo "<hr>";
//5.检查是否存在指定变量filter_has_var()
//http://edu.std.com/demo2.php?var1=test
//当前请求只有一个参数
var_dump(filter_has_var(INPUT_GET,'var1')); //返回true
echo "<br>";
var_dump(filter_has_var(INPUT_GET,'var2')); //返回false
// 6.验证过滤外部变量filter_input()
//http://edu.std.com/demo3.php?name=%3Cspan%3Etest%3C/span%3E
//FILTER_SANITIZE_STRING 清理过滤器
var_dump(filter_input(INPUT_GET,'name',FILTER_SANITIZE_STRING));
echo '<hr>';
//7.批量验证过滤外部变量filter_input_array()
$args = [
'name' => FILTER_SANITIZE_STRING, //清理过滤器,清理字符串中的非法字符
'age'=> ['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>18,'max_range'=>60]],
'email'=>FILTER_VALIDATE_EMAIL, //验证过滤器,验证邮箱格式
'is_married' => FILTER_VALIDATE_BOOLEAN, //验证过滤器,验证布尔值
'test_url'=> FILTER_VALIDATE_URL //验证过滤器,验证URL格式
];
echo "<pre>";
//http://edu.std.com/demo3.php?name=%3Cspan%3Edemo%3C/span%3E&age=200&email=1451535153qq.cpm&is_married=%E6%98%AF&test_url=edu.std.com/demo3.php
//非合法数据传值
var_dump(filter_input_array(INPUT_GET,$args));
/*array(5) {
["name"]=>
string(4) "demo"
["age"]=>
bool(false)
["email"]=>
bool(false)
["is_married"]=>
bool(false)
["test_url"]=>
bool(false)
}*/
//http://edu.std.com/demo3.php?name=demo&age=20&email=1451535153@qq.cpm&is_married=1&test_url=http://edu.std.com/demo3.php
var_dump(filter_input_array(INPUT_GET,$args));
/*
array(5) {
["name"]=>
string(4) "demo"
["age"]=>
int(20)
["email"]=>
string(17) "1451535153@qq.cpm"
["is_married"]=>
bool(true)
["test_url"]=>
string(28) "http://edu.std.com/demo3.php"
}
*/
代码执行结果:
//1.系统函数/内置函数
var_dump(111); //用于打印数据,并输出数据类型
echo '<hr>';
//2.自定义函数
function getStr(float $money , float $discount){
$pay = $money * $discount;
$str = '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
return $str;
}
echo getStr(1000 , 0.8);
echo '<hr>';
// 3.可变函数:将函数名称放在一个变量中进行引用
$funcName = 'getStr';
echo $funcName(5000 , 0.6);
echo '<hr>';
// 4. 匿名函数
$getStr = function (float $money , float $discount){
$pay = $money * $discount;
$str = '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
return $str;
}; //匿名函数不是代码块需要加分号结束
echo $getStr(4000,0.8);
echo '<hr>';
// 闭包函数,可以访问上一级空间的成员
$discount = 0.6;
// 访问上一层空间的$discount
$str = function (float $money) use ($discount){
$pay = $money * $discount;
return '原价:' .$money .' 元,实际支付 '.$pay . ' 元<br>';
};
echo $str(10000);
echo '<hr>';
$srting = function ($discount) {
// 使用上一层的$discount
// 子函数全局不可见,只有父函数可见
return function (float $money , int $num) use ($discount){
$p = $money * $num;
$pay = $p * $discount;
return '原价:' .$p .' 元,实际支付 '.$pay . ' 元<br>';
};
};
$pay = $srting(0.8);
echo $pay(500 , 8); //通过父函数访问子函数
echo $srting(0.8)(500,8);
代码执行结果如下:
函数必定有返回值,函数只支持单值返回,可以以下方式实现多值返回:
// 1.通过自负窜拼接返回多值
function res1(){
$status = 0;
$msg = 'success';
return $status . ' => ' . $msg .'<br>';
}
echo res1();
echo '<hr>';
// 2.通过数组的方式返回多值
function res2(){
$status = 0;
$msg = 'success';
$arr = ['status'=> $status,'msg' => $msg];
$str = implode(" => " , $arr);
return $str;
}
echo res2();
echo '<hr>';
// 3.通过json格式化字符串返回多值
function res3(){
$status = 0;
$msg = 'success';
$arr = ['status'=> $status,'msg' => $msg];
return json_encode($arr);
}
echo res3();
echo '<hr>';
// 4.通过将返回值序列化返回多值
function res4(){
$status = 0;
$msg = 'success';
$arr = ['status'=> $status,'msg' => $msg];
return serialize($arr);
}
echo res4();
代码执行结果如下:
函数的参数主要分为 4 种:值传递参数,引用参数,默认参数,剩余参数
//函数的参数
// 1.值参数:值传递参数(默认方式)
function demo1(int $argc){
// 函数中对参数的操作不影响外部参数的值
return $argc += 10000;
}
echo demo1(100),'<br>';
echo '<hr>';
// 2.应用参数,在参数前添加地址符 : &
function demo2(int &$argc){
// 函数中对参数的操作会改变外部参数的值
return $argc += 10000;
}
$var = 100;
echo demo2($var),'<br>';
echo $var,'<br>'; //10100
echo '<hr>';
// 3.默认参数
function demo3(int $argc, int $num = 1000){
return $argc += $num;
}
$var = 100;
echo demo3($var),'<br>'; //第二个参数不传值,默认使用默认参数1000
echo demo3($var, 3000);
echo '<hr>';
//4.剩余参数 ...rest /...spread
//...$args 将传入的参数全部放入到一个素组$args中
function demo4(...$args){
// 计算数组值的和
return array_sum($args);
}
// 传入值是多个参数
echo demo4(2,3,4,5,6),'<br>';
function demo5(...$args){
return array_sum($args);
}
$data = [2,3,4,5,6];
// ...spread 将数组参数打散
echo demo5(...$data);
代码执行结果如下:
回调函数是异步执行的重要工具,用call_user_func()
和call_user_func_array()
来回调函数
// 回调函数
function demo1(...$args){
return array_sum($args);
}
function demo2(){
sleep(5);
return '5s later <br>';
}
// 以回调的方式来执行一个函数
echo call_user_func('demo1',2,3,4,5,6);
echo '<br>';
echo call_user_func_array('demo1',[2,3,4,5,6]);
echo '<br>';
echo call_user_func('demo2'); //demo2 执行长时间过程,不影响后续代码的执行
echo 'sleep 5';
echo '<hr>';
$data = range(1,50);
// 将数组的值 *2 处理
$arr = array_map(function ($item) {
return $item *=2;
},$data);
print_r($arr);
代码执行结果如下:
php 中不允许在同一个命名空间中声明同名函数
//命名空间
namespace ns1;
function demo1(){
return '命名空间 ' . __NAMESPACE__ .' 的方法 ' . __FUNCTION__;
}
echo demo1();
echo '<hr>';
namespace ns2;
function demo1(){
return '命名空间 ' . __NAMESPACE__ .' 的方法 ' . __FUNCTION__;
}
echo demo1();
echo '<br>';
// 在ns2中调用ns1中的demo1()
echo \ns1\demo1();
代码执行结果如下:
字符串创建的方式有四种:单引号,双引号,heredoc,nowdoc;
单引号:单引号中的特殊字符,变量不能被解析,变量只能通过与字符串组合后输出,如果单引号中又出现单引号,必须使用转义符进行转义
双引号: 可以解析特殊字符和变量,多个空格或者回车在页面中被视为 1 个,如果双引号中出现双引号,必须使用转义符进行转义
heredoc: 双引号的升级本,可以解析变量,且双引号不需要被转义,使用于写 php+html 模版
nowdoc: 单引号的升级版,适合大段的存文本,不适合内嵌变量和特殊字符的文本
// 1.单引号 ''
$str = 'string';
// 单引号中变量不能被解析
echo 'This is a $str demo. <br>';
// 通过和变量拼接来解析变量
echo 'This is a ' . $str . ' demo. <br>';
//特殊字符 \r\n原样输出,不能被解析
echo 'This is \r\n a demo. <br>';
// 单引号中出现单引号,必须使用 \ 转义
echo 'This is a \'sting\' demo. <br>';
//输出一个\
echo 'This is a \\ demo';
echo '<hr>';
// 2.双引号 ""
// 双引号中变量被解析
echo "This is a {$str} demo. <br>";
// 双引号的特殊字符能被解析
echo "This is a \r\n demo. <br>";
// 双引号中出现双引号,必须使用 \ 转义
echo "This is a \"string\" demo. <br>";
echo '<hr>';
// 3.heredoc
$username = 'username';
//可以解析变量,且双引号不需要转义,适用于写html模版
echo <<< EOF
<fieldset>
<legend>用户登录</legend>
<form action="" method="post">
<div>
<label for="user-name">用户名:</label>
<input id="user-name" type="text" name="username" value="{$username}" placeholder="不少于10个字符" required autofocus />
</div>
<div>
<label for="pwd">密码:</label>
<input id="pwd" type="password" name="password" value="" placeholder="不少于8位" require />
</div>
<div>
<button>登录</button>
</div>
</form>
</fieldset>
EOF;
echo '<br>';
// 4.nowdoc
// nowdoc 的起始标签必须加单引号
echo <<< 'EOF'
This is a long {$str} <br>This is a \r\n <br>This is a long string <br>
This is a long string <br>
EOF;
// nowdoc不解析变量,适合写大段文本
代码执行结果如下: