博客列表 >0810-变量引用、字符串函数

0810-变量引用、字符串函数

三九三伏
三九三伏原创
2022年08月29日 13:47:39567浏览

一、 演示函数中引用外部变量的5种方法

PHP作用域:
不支持块作用域
支持函数作用域

  1. // 实例:不支持块作用域
  2. if(true){
  3. $a = 100;
  4. }
  5. echo $a.'<br>';


js中函数可以直接访问函数外的变量
php中不行

运行结果:

问题一 函数如何引用外部变量?

五种方式来解决:

  1. 关键字global方式引用外部变量。
  2. 超全局数组方式引用。
  3. 匿名函数/闭包方式将外部变量导入。function()use ($variable)
  4. 箭头函数方式引用(不建议用在生产环境)
  5. 纯函数方式,通过函数参数引入。

关键字global方式引用

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. function get_name():string {
  4. global $name;
  5. return 'Hello' .$name;
  6. }
  7. echo get_name(),'<br>';

运行结果:

超全局数组方式引用

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. function get_name():string {
  4. global $name;
  5. return 'Hello' .$GLOBALS['name'];
  6. }
  7. echo get_name(),'<br>';

匿名函数/闭包方式将外部变量导入,要有use否则报错。

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. $get_name = function () use ($name):string {
  4. return 'Hello'.$name;
  5. };
  6. echo $get_name(),'<br>';

箭头函数方式引用

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. $get_name = fn() => 'Hello'.$name;
  4. echo $get_name(),'<br>';

纯函数方式引入

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. $get_name = function($name):string{
  4. return 'Hello'.$name;
  5. };
  6. echo $get_name($name),'<br>';

问题二 外部如何引用函数私有变量?

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. $get_name = function() {
  4. $private_name = '路人乙';
  5. // 通过返回值返回数组,夹带私货,把函数内部变量导出。
  6. return ['Hello', $private_name];
  7. };
  8. //这种方式可以,但是不好,可以使用解构方式。
  9. // echo $get_name()[0],$get_name()[1].'<br>';
  10. // 将数组成员解构到独立变量中
  11. list($say, $priv_name) = $get_name();
  12. // 上面一行等同于: list($say, $priv_name) = [$get_name()[0],$get_name()[1]];
  13. echo $say, $priv_name, '<br>';

问题三 函数内部私有变量和外部变量同名时会怎么处理?

  1. $name = '路人甲';
  2. error_reporting(E_ALL);
  3. $get_name = function() use ($name) {
  4. // $name = '路人乙';
  5. // 通过返回值返回数组,夹带私货,把函数内部变量导出。
  6. return 'Hello'. $name;
  7. };
  8. // 函数内部变量会覆盖外部同名变量
  9. echo $get_name();

常量

  1. 声明
    define和const定义常量。大写且不用“$”符号。
    define是函数,可用在if中,不能用在类中。
    const在编译阶段处理,速度更快,必须在作用域顶部声明。
    常量不收作用域限制,全局有效。
  2. 查看
    echo
    constant
  3. 类型
    自定义
    预定义(不可变,可变(魔术常量))
  1. //------------自定义常量----------------
  2. define('USER_NAME', 'admin');
  3. const EMAIL = 'admin.php.cn';
  4. echo USER_NAME.','.EMAIL.'<br>';
  5. function hello():string{
  6. return sprintf('Hello,%s,(%s)',USER_NAME,EMAIL);
  7. }
  8. echo hello().'<hr>';
  9. echo USER_NAME;
  10. echo constant('USER_NAME');
  11. // constant不能打印const定义的常量
  12. // echo constant('EMAIL');
  13. // 空字符可以当常量名
  14. define('','php中文网');
  15. //constant可以打印空字符常量用于特殊用途
  16. echo constant('');
  17. //------------预定义常量----------------
  18. echo 'php版本:'.PHP_VERSION.'<br>';
  19. echo '操作系统:'.PHP_OS.'<br>';
  20. // 预定义常量的子集:魔术常量
  21. // 他是变化的,是系统自动赋值和维护更新,用户不能修改(只读)。
  22. echo '当前行号:'.__LINE__.'<br>';
  23. echo '当前文件:'.__FILE__.'<br>';
  24. echo '当前路径:'.__DIR__.'<br>';

二、字符串

1. 使用介绍

单引号
1、纯文本
定界符:单引号/nowdoc
特点:不解析变量,不转义特殊符号的转义序列
场景:静态文本,不含变量和转义符

双引号
模板字符串
定界符:双引号/heredoc
特点:解析变量,转义特殊字符
场景:包含插值变量和特殊字符的动态模板。

  1. // ------传统单引号---------
  2. $domain = 'https://www.php.cn';
  3. $str = '网站名称:\n\r $domain';
  4. echo $str.'<br>';
  5. // ------newdoc:单引号语法糖,适合大段文本---------
  6. $str = <<< 'ANYNAME'
  7. <header>
  8. <a href="">首页</a>
  9. <a href="">视频</a>
  10. <a href="">文章</a>
  11. </header>
  12. ANYNAME;
  13. echo $str.'<br>';
  14. // ------双引号---------
  15. $site = "网站名称:\n\r $domain";
  16. echo $site.'<br>';//换行效果上页面上不换行,但右键查看源代码,效果是换行的。
  17. // ------heredoc双引号语法糖---------
  18. // 适用大段的,多行的动态文本内容,内部有变量和大量双引号(不用转义)。
  19. $tpl = <<<"ANYNAME"
  20. <ul style="display: inline-grid; border:1px solid">
  21. <li style="color: brown;">PHP中文网</li>
  22. <li>$domain</li>
  23. </ul>
  24. ANYNAME;
  25. echo $tpl;

备注

  1. 代码中ANYNAME是标识符,全大写是行业约定,可任意命名,需成对出现。
  2. nowdoc的标识符的单引号’ANYNAME’必须要写。
  3. heredoc的标识符的双引号是可选的,例如ANYNAME是可以的,而且推荐不加双引号。
  4. 更多转义序列

2. 字符串函数

  1. // 字符串常量函数
  2. // 1. string <-> array
  3. // array-> string:implode($separator,$arr):string
  4. $color = ['red','green','blue'];
  5. echo implode('-',$color).'<br>';
  6. // string -> array:explode($separator, $string)
  7. $link = 'mysql:dbname=phpedu;root;root';
  8. $dbconfig = explode(';',$link);
  9. print_r($dbconfig);
  10. // list解构
  11. list($dsn,$username,$passwd) = explode(';',$link);
  12. printf('<br>dsn = %s<br>username = %s<br>password =%s<br>',$dsn,$username,$passwd);
  13. // vprintf打印
  14. $db = explode(';',$link);
  15. $tpl = '<br>dsn = %s<br>username = %s<br>password =%s<br>';
  16. vprintf($tpl,$db);
  17. echo '<hr>';
  18. // 2. 查询和替换
  19. $str = '中文网';
  20. // -------取子串-------
  21. // 一个中文三个字符
  22. echo substr($str, 0, 3).'<br>';
  23. echo substr($str, 3).'<br>';
  24. // 反向
  25. echo substr($str, -3).'<br>';
  26. // -------首字符出现之后-------
  27. $img = 'banner.png';
  28. // '.'之后的字符串,得到结果再去掉左边的'.'
  29. echo ltrim(strstr($img,'.'),'.').'<br>';
  30. // 获取文件名,true表示向前获取
  31. echo strstr($img,'.',true).'<br>';
  32. // -------获取位置-------
  33. echo strpos($str, '文').'<br>';
  34. // 从第三个字符开始查找
  35. echo strpos($img, 'n',3).'<br>';
  36. // -------替换-------
  37. $class = '\admin\controller\User';
  38. // 各系统文件路径分隔符不同,可以用一个常量DIRECTORY_SEPARATOR来统一替代
  39. //DIRECTORY_SEPARATOR太长,可以重定义
  40. define('DS',DIRECTORY_SEPARATOR);
  41. echo str_replace('\\',DS,$class).'.php<br>';
  42. $bad = ['血腥','暴力','颜色'];
  43. // 一对一替换
  44. // $good = ['喵喵','旺旺','咯咯'];
  45. // 统一替换
  46. $good = ['***'];
  47. $str = '不得带有血腥,隐藏暴力,无视颜色的内容';
  48. echo str_replace($bad,$good,$str).'<br>';
  49. // ------删除字符------
  50. $str = ' php.cn ';
  51. echo strlen($str).'<br>';
  52. echo strlen(trim($str)).'<br>';
  53. $str = trim($str);
  54. echo rtrim($str,'.cn').'<br>';
  55. echo ltrim($str,'php.').'<br>';
  56. // html/php/js 标签都过滤掉
  57. echo strip_tags('<?php echo \'Hello PHP\' ?><h1>php.cn</h1><script>console.log("Hello JS");</script>');
  58. echo '<br>';
  59. // ------URL相关------
  60. $url = 'http://phpedu.io/0810/demo4.php?a=1&b=2&c=3';
  61. // "?a=1&b=2&c=3"这部分叫查询字符串
  62. echo $_SERVER['QUERY_STRING'].'<br>';
  63. // 查询字符串转为数组
  64. parse_str($_SERVER['QUERY_STRING'],$arr);
  65. printf('<pre>%s</pre>',print_r($arr,true));
  66. $arr = parse_url($url);
  67. printf('<pre>%s</pre>',print_r($arr,true));
  68. echo parse_url($url)['query'].'<br>';
  69. // ------大小写------
  70. $foo = 'HelloWorld';
  71. // 第一个字母小写
  72. $foo = lcfirst($foo);
  73. echo $foo.'<br>';
  74. // 全部大写
  75. echo strtoupper($foo).'<br>';
  76. // ------md5散列值------
  77. echo md5($foo).'<br>';
  78. // ------数字格式化------
  79. $number = 1234.56;
  80. // 英文千位分割
  81. echo number_format($number).'<br>';
  82. // ---转换字符串第一个字节为0-255之间的值---
  83. $str = "\n";
  84. echo ord($str).'<br>';
  85. // ------统计出现次数------
  86. $text = 'This is a test';
  87. echo substr_count($text, 'is').'<br>';
  88. // ------反转字符串------
  89. echo strrev("Hello world!");
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议