批改状态:合格
老师批语:
<?phpnamespace _0810;// 问题一、函数内部如何使用函数外部变量// 作用域// 1、不支持块作用域// 2、支持函数作用域// js// {// let a =1;// }// clg a 不能访问a// 1、 不支持块作用域if( true){$a =100;}// 可以拿到,虽然 a在 代码块中,但是在外边仍然可拿到echo $a .'<br>';// 2、支持函数作用域$name ='小狗';// 方式一 全局 关键字function hello():string {// js函数中可以直接访问自由变量(函数外部声明的遍历)// 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案global $name;return 'hello,' .$name;}echo hello().'<hr>';/*** 函数内部使用外部变量的5种方式* 1. global 全局 关键字* 2. $GLOBALS['outer'] 超全局变量* 3. function () use ($outer) {...} use 关键字 闭包方式* 4. fn()=>(...) 箭头函数。php不建议容,功能比较弱* 5. function ($outer) {...} 参数注入*/// 方式二超全局 数组function hello1():string {// js函数中可以直接访问自由变量(函数外部声明的遍历)// 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案// return 'hello,' .$name;return 'hello,' .$GLOBALS['name'];}// print_r($GLOBALS);// $GLOBALS['name'] == $name// 可以拿到name 小狗// print_r($GLOBALS['name']);// 可以拿到name hello 小狗echo hello1().'<hr>';// 方式三unction () use ($outer) {...} use 关键字 闭包方式 匿名函数$name ='小猫';$hello3 =function( ) use ($name):string {return 'hel' .$name ;};echo $hello3().'<hr>';// 方式四 ,生产环境不用。 箭头函数 () 必须要加关键字 fn 规定 自动注入 多条语句时,不能用箭头函数 箭头后面就是表达式$name ='小牛';$hello4 = fn( ) => 'hel' .$name ;echo $hello4().'<hr>';// 方式五 纯函数:将函数依赖的外部数据,通过参数注入导函数内部$name ='小龙';$hello5 =function($name):string{return 'hel'.$name;};echo $hello5($name).'<hr>';// 问题二 如果在函数外部,如何访问 函数内部的声明变量// 方式一$hello21 =function(){// 私有变量 有作用域$username = '小鸭';return $username;};$user = $hello21();echo $user;// 方式二$hello22 =function(){// 私有变量 有作用域$username = '小鸭';// 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回// 返回一个数组 【正常返回的数据,私有变量】return ['hello,',$username];};$user = $hello22()[1];echo $user;// 方式三 解构方式$hello23 =function(){// 私有变量 有作用域$username = '小社';// 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回// 返回一个数组 【正常返回的数据,私有变量】return ['hello,',$username];};// 将数组成员,解构到独立变量中list($username ,$result) = $hello23();// list($username ,$result) = [$hello23()[0],$hello23()[1]]; 相等 解构echo $username ,$result ;// 问题3: 如果函数私有变量与外部变量同名怎么办?$name = '小张';$hello31 = function () use ($name) : string {// 私有变量$name = '小李';return 'Hello , ' . $name;};// 张老师, 还是李老师// 输出李老师, 因为函数内, 同名私有变量 $name 会覆盖外部同名变量echo $hello31(). '<hr>';
<?php// 字符串 两种声明// 1、单引号// 2、双引号/*** 1. 纯文本* (1) 定界符: 单引号 / nowdoc* (2) 特点: 不解析变量, 不转义特殊符号的转义序列* (3) 场景: 静态文本,不含变量和转义符*/// nowdoc 传统的单引号$domain = 'http://www.baidu.com';// \n\r 代表回车换行 但是在单引号里面原样显示。变量 $domain 不处理,不生效 不解析变量 适合大段文本$str = '网站名称 : \n\r $domain ' ;echo $str;// 语法糖// nowdoc 传统的单引号 适合写大段多行文本// 标识符$str = <<<'TEXT'<header><nav><a href="">首页</a><a href="">视频</a><a href="">文章</a></nav></header>TEXT;echo $str;/*** 2. 模板字符串* (1) 定界符: 双引号 / heredoc* (2) 特点: 解析变量, 转义特殊符号* (3) 场景: 包含插值变量和特殊字符的就动态模板*/$site = "网站名称:\n\r $domain";echo $site;$site = "网站名称:\n\r \"$domain\"";echo $site;// 双引号 / heredoc 语法糖// 适用于大段的多行的动态文本内容,内部有变量和大量的双引号// html 模板 "$tp1 = <<< "PHPCN"<ul style="display: inline-block; border:1px solid "><li>百度</li><li style="color:brown">http://www.baidu.com</li></ul>PHPCN;// 注意PHPCN; 顶格写echo $tp1;/*** 备注* 1. TXT, PHPCN: 只是标识符,全大写只是行业约定, 可任意命名,只要成对出现即可* 2. nowdoc的标识符,单引号必须写,如 'TXT'* 3. heredoc: PHPCN双引号是可选的, 例如 PHPCN也可以, 推荐不要写* 4. 更多转义序列: https://www.php.net/manual/zh/language.types.string.php#language.types.string.syntax.single*/
<?phpnamespace _0810;use const _0810\EMAIL as _0810EMAIL;// 1、常量// 1.1、define()// 1.2、const()// 惯例全部大写,s蛇形命名,用下划线连接// 常量前面不加$符号 约定全部大写,蛇形命名 约定大于规则define('U_N','admin');const EMAIL = '123@qq.com';echo U_N , ',',EMAIL;/*** define, const 区别* 1. define是函数,可用在if中, 不能用在类中 不能预编译* 2. const: 编译阶段处理, 速度更快, 必须在作用域顶部声明,可用在类中, 不能用在if中* 3. 常量不受作用域限制 , 全局有效*/function hello() : string{// return print_r(U_N,true);// return print_r(EMAIL,true);// return printf('<pre>%s</pre>',print_r(U_N,true));// return printf('<pre>%s</pre>',print_r(EMAIL,true));// return sprintf('<pre>%s</pre>',print_r(EMAIL,true));// return sprintf('<pre>%s</pre>',print_r(EMAIL));return sprintf(' %s %s',U_N,EMAIL);}echo hello();// constant( ) 显示一个常量echo U_N;echo constant('U_N');// const 声明的常量 不能用 constant 打印// echo constant('EMAIL');echo '<hr>';// 空字符合一当常量名 保存全局数据 如版本号、操作系统等define( '','php');// constant( ) 可以空字符// 空字符声明一个常量, 是否全法?echo constant('');// 不报错,完全合法,但你就是看不到echo '';// 自定义常量// 预定义常量、echo 'php版本'.PHP_VERSION.'<br>';echo '操作系统'.PHP_OS.'<br>';// 预定义常量的子集:魔术常量 前后缀有两个下划线// 它的值 是变化的 是由系统自动赋值与更新,用户不能修稿,只读echo '当前行号'.__LINE__.'<br>';echo '当前文件'.__FILE__.'<br>';echo '当前路径/目录'.__DIR__.'<br>';// 因为常量可以无视作用域, 可以在所有php脚本中, 横冲直撞, 无冕之王// 所以,特别适合保存一些全局可能用到,并且需要在所有脚本中保持数据一致的值,例如版本号// 这种由php系统定义, 程序员无须提前声明,可以直接拿来就用的常量,叫"预定义常量" 或"内置常量"// (2) 特殊的预定义常量: 魔术常量// 魔术常量,其实是预定义常量的一个子集// 为什么叫魔术常量?// 常量二大特征: 有确定的值, 具不能修改// 但是魔术常量, 没有确定的值,上系统自动更新维护,用户不能改,所以叫魔术常量
<?phpnamespace _0810;// 字符串 常量函数// 1、string <-> array// separator 分隔符// 1.1 数组转字符串 array-> string implode($separator,$arr):string$colors = ['red','green','blue'];echo implode(',',$colors);// 1.2 字符串转数组 string -> array explode($separator,$string)$link = 'mysql:dbname=phpedu;root;root';// 用 ; 分割上面的数据库连接参数// 注意 explode 里面的 ; 号是字符串 里面的分隔标识// $db = explode(';',$link);// print_r($db);// list($dsn,$user,$password) = explode(';',$link);// printf('dsn = %s<br>user=%s<br>password=%s<br>',$dsn,$user,$password);// 简化$arr = list($dsn,$user,$password) = explode(';',$link);vprintf('dsn = %s<br>user=%s<br>password=%s<br>',$arr);echo '<hr>';// 2、查询 与替换$str = 'phpbaidu';// substr($tr,start ,size)子串// 正向echo substr($str,0,3).'<br>';echo substr($str,4,2).'<br>';echo substr($str,4,0).'<br>';echo substr($str,4).'<br>';// 反向 -1 -2 -3 -4echo substr($str,-2,2).'<br>';// strstr :首次字符出现的位置之后的字符// 获取文件扩展名$img = 'banner.png';echo strstr($img,'.').'<br>';// 去掉扩展名 ltrim 左边 rtrim右边echo ltrim( strstr($img,'.'),'.').'<br>';// echo rtrim( strstr($img,'.'),'.').'<br>';// 获取文件名 增加 trueecho strstr($img,'.',true).'<br>';// 获取位置 首次出现的索引// strpos 首次出现的索引// delete from staff where id =1echo strpos($str,'p').'<br>';// 第三个 设置起点echo strpos($str,'p',1).'<br>';// 字符串替换 str_replace// \admin\controller\User 类文件路径$class = '\admin\controller\User';// 注意要两个\不然会转义echo str_replace('\\','/',$class) .'<br>';echo str_replace('a','b',$class) .'<br>';// 考虑到不同操作系统, 路径分隔符不同,例如windows: "/,\", linux/max: /// echo str_replace('\\',DIRECTORY_SEPARATOR,$class).'<br>';// 简化重定义define('DS',DIRECTORY_SEPARATOR);echo str_replace('\\',DS,$class) .'<br>';$bad = ['交友','异性'];$goos = ['你好','吃饭'];$str = '我要某个交友软件,找了异性朋友';// $bad 和 $goos 一 一对应echo str_replace($bad,$goos,$str) .'<br>';$bad = ['交友','异性'];$goos = '***';$str = '我要某个交友软件,找了异性朋友';// $bad 和 $goos 一 一对应echo str_replace($bad,$goos,$str) .'<br>';// 3、删除指定字符$str = ' baidu.com ';echo strlen($str) .'<br>';// 空格过滤echo strlen(trim($str)) .'<br>';// 去掉指定字符// 从右边去$str = 'php.cn';echo rtrim($str,'.cn').'<br>';echo ltrim($str,'php.').'<br>';// 过滤html 标签echo strip_tags('<h1>php</h1>').'<br>';// 过滤 php 代码 过滤js 防止脚本注入echo strip_tags('<h1>php</h1><?php ecoh \'hello\' ?>').'<br>';// trim(string $string, string $characters = " \t\n\r\0\x0B"): string// 相关: ltrim(), rtrim(),仅删除左边或右边字符// strip_tags(string $string, string[]|string|null $allowed_tags = null): strings// 4、url相关$url = 'http://bittel.com/zuoye.php?a=1&b=2&c=3';// ?a=1&b=2&c=3 查询字符串 ,get请求 向服务器发送查询参数// "?"后面称为"查询字符串",用于GET请求是发送到后端的参数// 使用系统常量可获取到url中的查询字符串// print_r($_SERVER);// QUERY_STRING 获取查询字符串echo $_SERVER['QUERY_STRING'] . '<br>';// 查询字符串 保存到数组内parse_str( $_SERVER['QUERY_STRING'] ,$arr );printf('<pre>%s</pre>',print_r($arr,true));// parse_url()$arr = parse_url($url);printf('<pre>%s</pre>', print_r($arr,true) );echo parse_url($url)['query'];// 反函数 : 将数组转为查询字符串echo http_build_query(['a' => 1, 'b' => 2, 'c' => 3]) . '<br>';
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号