博客列表 >1. 演示函数中引用外部变量的5种方法 2. 至少选择5个课堂上没讲到的字符串函数进行演示

1. 演示函数中引用外部变量的5种方法 2. 至少选择5个课堂上没讲到的字符串函数进行演示

P粉314265155
P粉314265155原创
2022年08月15日 19:10:46312浏览

函数内部如何使用函数外部变量

  1. <?php
  2. namespace _0810;
  3. // 问题一、函数内部如何使用函数外部变量
  4. // 作用域
  5. // 1、不支持块作用域
  6. // 2、支持函数作用域
  7. // js
  8. // {
  9. // let a =1;
  10. // }
  11. // clg a 不能访问a
  12. // 1、 不支持块作用域
  13. if( true){
  14. $a =100;
  15. }
  16. // 可以拿到,虽然 a在 代码块中,但是在外边仍然可拿到
  17. echo $a .'<br>';
  18. // 2、支持函数作用域
  19. $name ='小狗';
  20. // 方式一 全局 关键字
  21. function hello():string {
  22. // js函数中可以直接访问自由变量(函数外部声明的遍历)
  23. // 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案
  24. global $name;
  25. return 'hello,' .$name;
  26. }
  27. echo hello().'<hr>';
  28. /**
  29. * 函数内部使用外部变量的5种方式
  30. * 1. global 全局 关键字
  31. * 2. $GLOBALS['outer'] 超全局变量
  32. * 3. function () use ($outer) {...} use 关键字 闭包方式
  33. * 4. fn()=>(...) 箭头函数。php不建议容,功能比较弱
  34. * 5. function ($outer) {...} 参数注入
  35. */
  36. // 方式二超全局 数组
  37. function hello1():string {
  38. // js函数中可以直接访问自由变量(函数外部声明的遍历)
  39. // 但是在php中不行 。不能直接访问函数外部的全局 变量,但是有5种解决方案
  40. // return 'hello,' .$name;
  41. return 'hello,' .$GLOBALS['name'];
  42. }
  43. // print_r($GLOBALS);
  44. // $GLOBALS['name'] == $name
  45. // 可以拿到name 小狗
  46. // print_r($GLOBALS['name']);
  47. // 可以拿到name hello 小狗
  48. echo hello1().'<hr>';
  49. // 方式三unction () use ($outer) {...} use 关键字 闭包方式 匿名函数
  50. $name ='小猫';
  51. $hello3 =function( ) use ($name):string {
  52. return 'hel' .$name ;
  53. };
  54. echo $hello3().'<hr>';
  55. // 方式四 ,生产环境不用。 箭头函数 () 必须要加关键字 fn 规定 自动注入 多条语句时,不能用箭头函数 箭头后面就是表达式
  56. $name ='小牛';
  57. $hello4 = fn( ) => 'hel' .$name ;
  58. echo $hello4().'<hr>';
  59. // 方式五 纯函数:将函数依赖的外部数据,通过参数注入导函数内部
  60. $name ='小龙';
  61. $hello5 =function($name):string{
  62. return 'hel'.$name;
  63. };
  64. echo $hello5($name).'<hr>';
  65. // 问题二 如果在函数外部,如何访问 函数内部的声明变量
  66. // 方式一
  67. $hello21 =function(){
  68. // 私有变量 有作用域
  69. $username = '小鸭';
  70. return $username;
  71. };
  72. $user = $hello21();
  73. echo $user;
  74. // 方式二
  75. $hello22 =function(){
  76. // 私有变量 有作用域
  77. $username = '小鸭';
  78. // 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回
  79. // 返回一个数组 【正常返回的数据,私有变量】
  80. return ['hello,',$username];
  81. };
  82. $user = $hello22()[1];
  83. echo $user;
  84. // 方式三 解构方式
  85. $hello23 =function(){
  86. // 私有变量 有作用域
  87. $username = '小社';
  88. // 如果 外部需要 这个私有变量 可以将它所谓返回数据的赠品来返回
  89. // 返回一个数组 【正常返回的数据,私有变量】
  90. return ['hello,',$username];
  91. };
  92. // 将数组成员,解构到独立变量中
  93. list($username ,$result) = $hello23();
  94. // list($username ,$result) = [$hello23()[0],$hello23()[1]]; 相等 解构
  95. echo $username ,$result ;
  96. // 问题3: 如果函数私有变量与外部变量同名怎么办?
  97. $name = '小张';
  98. $hello31 = function () use ($name) : string {
  99. // 私有变量
  100. $name = '小李';
  101. return 'Hello , ' . $name;
  102. };
  103. // 张老师, 还是李老师
  104. // 输出李老师, 因为函数内, 同名私有变量 $name 会覆盖外部同名变量
  105. echo $hello31(). '<hr>';

字符串声明

  1. <?php
  2. // 字符串 两种声明
  3. // 1、单引号
  4. // 2、双引号
  5. /**
  6. * 1. 纯文本
  7. * (1) 定界符: 单引号 / nowdoc
  8. * (2) 特点: 不解析变量, 不转义特殊符号的转义序列
  9. * (3) 场景: 静态文本,不含变量和转义符
  10. */
  11. // nowdoc 传统的单引号
  12. $domain = 'http://www.baidu.com';
  13. // \n\r 代表回车换行 但是在单引号里面原样显示。变量 $domain 不处理,不生效 不解析变量 适合大段文本
  14. $str = '网站名称 : \n\r $domain ' ;
  15. echo $str;
  16. // 语法糖// nowdoc 传统的单引号 适合写大段多行文本
  17. // 标识符
  18. $str = <<<'TEXT'
  19. <header>
  20. <nav>
  21. <a href="">首页</a>
  22. <a href="">视频</a>
  23. <a href="">文章</a>
  24. </nav>
  25. </header>
  26. TEXT;
  27. echo $str;
  28. /**
  29. * 2. 模板字符串
  30. * (1) 定界符: 双引号 / heredoc
  31. * (2) 特点: 解析变量, 转义特殊符号
  32. * (3) 场景: 包含插值变量和特殊字符的就动态模板
  33. */
  34. $site = "网站名称:\n\r $domain";
  35. echo $site;
  36. $site = "网站名称:\n\r \"$domain\"";
  37. echo $site;
  38. // 双引号 / heredoc 语法糖
  39. // 适用于大段的多行的动态文本内容,内部有变量和大量的双引号
  40. // html 模板 "
  41. $tp1 = <<< "PHPCN"
  42. <ul style="display: inline-block; border:1px solid ">
  43. <li>百度</li>
  44. <li style="color:brown">http://www.baidu.com</li>
  45. </ul>
  46. PHPCN;
  47. // 注意PHPCN; 顶格写
  48. echo $tp1;
  49. /**
  50. * 备注
  51. * 1. TXT, PHPCN: 只是标识符,全大写只是行业约定, 可任意命名,只要成对出现即可
  52. * 2. nowdoc的标识符,单引号必须写,如 'TXT'
  53. * 3. heredoc: PHPCN双引号是可选的, 例如 PHPCN也可以, 推荐不要写
  54. * 4. 更多转义序列: https://www.php.net/manual/zh/language.types.string.php#language.types.string.syntax.single
  55. */

常量

  1. <?php
  2. namespace _0810;
  3. use const _0810\EMAIL as _0810EMAIL;
  4. // 1、常量
  5. // 1.1、define()
  6. // 1.2、const()
  7. // 惯例全部大写,s蛇形命名,用下划线连接
  8. // 常量前面不加$符号 约定全部大写,蛇形命名 约定大于规则
  9. define('U_N','admin');
  10. const EMAIL = '123@qq.com';
  11. echo U_N , ',',EMAIL;
  12. /**
  13. * define, const 区别
  14. * 1. define是函数,可用在if中, 不能用在类中 不能预编译
  15. * 2. const: 编译阶段处理, 速度更快, 必须在作用域顶部声明,可用在类中, 不能用在if中
  16. * 3. 常量不受作用域限制 , 全局有效
  17. */
  18. function hello() : string{
  19. // return print_r(U_N,true);
  20. // return print_r(EMAIL,true);
  21. // return printf('<pre>%s</pre>',print_r(U_N,true));
  22. // return printf('<pre>%s</pre>',print_r(EMAIL,true));
  23. // return sprintf('<pre>%s</pre>',print_r(EMAIL,true));
  24. // return sprintf('<pre>%s</pre>',print_r(EMAIL));
  25. return sprintf(' %s %s',U_N,EMAIL);
  26. }
  27. echo hello();
  28. // constant( ) 显示一个常量
  29. echo U_N;
  30. echo constant('U_N');
  31. // const 声明的常量 不能用 constant 打印
  32. // echo constant('EMAIL');
  33. echo '<hr>';
  34. // 空字符合一当常量名 保存全局数据 如版本号、操作系统等
  35. define( '','php');
  36. // constant( ) 可以空字符
  37. // 空字符声明一个常量, 是否全法?
  38. echo constant('');
  39. // 不报错,完全合法,但你就是看不到
  40. echo '';
  41. // 自定义常量
  42. // 预定义常量、
  43. echo 'php版本'.PHP_VERSION.'<br>';
  44. echo '操作系统'.PHP_OS.'<br>';
  45. // 预定义常量的子集:魔术常量 前后缀有两个下划线
  46. // 它的值 是变化的 是由系统自动赋值与更新,用户不能修稿,只读
  47. echo '当前行号'.__LINE__.'<br>';
  48. echo '当前文件'.__FILE__.'<br>';
  49. echo '当前路径/目录'.__DIR__.'<br>';
  50. // 因为常量可以无视作用域, 可以在所有php脚本中, 横冲直撞, 无冕之王
  51. // 所以,特别适合保存一些全局可能用到,并且需要在所有脚本中保持数据一致的值,例如版本号
  52. // 这种由php系统定义, 程序员无须提前声明,可以直接拿来就用的常量,叫"预定义常量" 或"内置常量"
  53. // (2) 特殊的预定义常量: 魔术常量
  54. // 魔术常量,其实是预定义常量的一个子集
  55. // 为什么叫魔术常量?
  56. // 常量二大特征: 有确定的值, 具不能修改
  57. // 但是魔术常量, 没有确定的值,上系统自动更新维护,用户不能改,所以叫魔术常量

字符串 常量函数

  1. <?php
  2. namespace _0810;
  3. // 字符串 常量函数
  4. // 1、string <-> array
  5. // separator 分隔符
  6. // 1.1 数组转字符串 array-> string implode($separator,$arr):string
  7. $colors = ['red','green','blue'];
  8. echo implode(',',$colors);
  9. // 1.2 字符串转数组 string -> array explode($separator,$string)
  10. $link = 'mysql:dbname=phpedu;root;root';
  11. // 用 ; 分割上面的数据库连接参数
  12. // 注意 explode 里面的 ; 号是字符串 里面的分隔标识
  13. // $db = explode(';',$link);
  14. // print_r($db);
  15. // list($dsn,$user,$password) = explode(';',$link);
  16. // printf('dsn = %s<br>user=%s<br>password=%s<br>',$dsn,$user,$password);
  17. // 简化
  18. $arr = list($dsn,$user,$password) = explode(';',$link);
  19. vprintf('dsn = %s<br>user=%s<br>password=%s<br>',$arr);
  20. echo '<hr>';
  21. // 2、查询 与替换
  22. $str = 'phpbaidu';
  23. // substr($tr,start ,size)子串
  24. // 正向
  25. echo substr($str,0,3).'<br>';
  26. echo substr($str,4,2).'<br>';
  27. echo substr($str,4,0).'<br>';
  28. echo substr($str,4).'<br>';
  29. // 反向 -1 -2 -3 -4
  30. echo substr($str,-2,2).'<br>';
  31. // strstr :首次字符出现的位置之后的字符
  32. // 获取文件扩展名
  33. $img = 'banner.png';
  34. echo strstr($img,'.').'<br>';
  35. // 去掉扩展名 ltrim 左边 rtrim右边
  36. echo ltrim( strstr($img,'.'),'.').'<br>';
  37. // echo rtrim( strstr($img,'.'),'.').'<br>';
  38. // 获取文件名 增加 true
  39. echo strstr($img,'.',true).'<br>';
  40. // 获取位置 首次出现的索引
  41. // strpos 首次出现的索引
  42. // delete from staff where id =1
  43. echo strpos($str,'p').'<br>';
  44. // 第三个 设置起点
  45. echo strpos($str,'p',1).'<br>';
  46. // 字符串替换 str_replace
  47. // \admin\controller\User 类文件路径
  48. $class = '\admin\controller\User';
  49. // 注意要两个\不然会转义
  50. echo str_replace('\\','/',$class) .'<br>';
  51. echo str_replace('a','b',$class) .'<br>';
  52. // 考虑到不同操作系统, 路径分隔符不同,例如windows: "/,\", linux/max: /
  53. // echo str_replace('\\',DIRECTORY_SEPARATOR,$class).'<br>';
  54. // 简化重定义
  55. define('DS',DIRECTORY_SEPARATOR);
  56. echo str_replace('\\',DS,$class) .'<br>';
  57. $bad = ['交友','异性'];
  58. $goos = ['你好','吃饭'];
  59. $str = '我要某个交友软件,找了异性朋友';
  60. // $bad 和 $goos 一 一对应
  61. echo str_replace($bad,$goos,$str) .'<br>';
  62. $bad = ['交友','异性'];
  63. $goos = '***';
  64. $str = '我要某个交友软件,找了异性朋友';
  65. // $bad 和 $goos 一 一对应
  66. echo str_replace($bad,$goos,$str) .'<br>';
  67. // 3、删除指定字符
  68. $str = ' baidu.com ';
  69. echo strlen($str) .'<br>';
  70. // 空格过滤
  71. echo strlen(trim($str)) .'<br>';
  72. // 去掉指定字符
  73. // 从右边去
  74. $str = 'php.cn';
  75. echo rtrim($str,'.cn').'<br>';
  76. echo ltrim($str,'php.').'<br>';
  77. // 过滤html 标签
  78. echo strip_tags('<h1>php</h1>').'<br>';
  79. // 过滤 php 代码 过滤js 防止脚本注入
  80. echo strip_tags('<h1>php</h1><?php ecoh \'hello\' ?>').'<br>';
  81. // trim(string $string, string $characters = " \t\n\r\0\x0B"): string
  82. // 相关: ltrim(), rtrim(),仅删除左边或右边字符
  83. // strip_tags(string $string, string[]|string|null $allowed_tags = null): strings
  84. // 4、url相关
  85. $url = 'http://bittel.com/zuoye.php?a=1&b=2&c=3';
  86. // ?a=1&b=2&c=3 查询字符串 ,get请求 向服务器发送查询参数
  87. // "?"后面称为"查询字符串",用于GET请求是发送到后端的参数
  88. // 使用系统常量可获取到url中的查询字符串
  89. // print_r($_SERVER);
  90. // QUERY_STRING 获取查询字符串
  91. echo $_SERVER['QUERY_STRING'] . '<br>';
  92. // 查询字符串 保存到数组内
  93. parse_str( $_SERVER['QUERY_STRING'] ,$arr );
  94. printf('<pre>%s</pre>',print_r($arr,true));
  95. // parse_url()
  96. $arr = parse_url($url);
  97. printf('<pre>%s</pre>', print_r($arr,true) );
  98. echo parse_url($url)['query'];
  99. // 反函数 : 将数组转为查询字符串
  100. echo http_build_query(['a' => 1, 'b' => 2, 'c' => 3]) . '<br>';
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议