Blogger Information
Blog 35
fans 0
comment 0
visits 17150
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0810-变量引用、字符串函数
三九三伏
Original
574 people have browsed it

一、 演示函数中引用外部变量的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!");
Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post