批改状态:合格
老师批语:
变量是临时存储数据的容器,是实现数据服用的手段。变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制。变量必须以$作为开始,变量名区分大小写
常量创建必须给定一个值,一旦被定义就无法再更改,通常用大写表示。常量不受作用域限制
变量名必须以$作为开始,不允许使用特殊字符,数字作为变量的开始,必须使用字母或下划线开始,后面允许使用数字
常量的创建分为两种:关键字 const 创建,define() 函数创建,在类中,类的常量只能用 const 创建
//变量$str = '这是一个变量';//常量,一旦定义就无法更改const APP_NAME = 'demo';define('APP_ID', 110);class Demo {const CLASS_NAME = 'Demo';}$name = 'APP_NAME';
变量和常量都可以使用 echo 直接输出 echo 没有返回值,效率最高,常量的变量化,只能使用constant()函数来获取
//输出变量$aecho $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;//验证不通过将返回falsevar_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')); //返回trueecho "<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.phpvar_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>'; //10100echo '<hr>';// 3.默认参数function demo3(int $argc, int $num = 1000){return $argc += $num;}$var = 100;echo demo3($var),'<br>'; //第二个参数不传值,默认使用默认参数1000echo 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不解析变量,适合写大段文本
代码执行结果如下:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号