PHP8 与 PHP7 的差别是什么?命名参数又是啥意思呢?

yufei       3 年, 2 月 前       1366

看到新房子的马路对面一家公司在招 PHP 程序员,虽然工资打了个对半开的折扣,但这个走路 10 分钟就能到家的感觉,还是蛮心动的,于是乎,复习复习,去看看啥情况。

PHP8 出来很久了,一直也没时间去看看改进或者增加了什么功能,也不知道 ThinkPHP 和 Laravel 对 PHP8 的支持度如何。闲来无事,就来看看 PHP8 有啥新魔法吧

1. 对命名参数的支持

说起 命名参数,那么就要了解另外两个概念 必须参数可选参数。 这三个概念啊,其实都是在调用函数的时候才会有用到,但区别,其实在函数定义的时候就已经出现了。 就拿官方给的 htmlspecialchars() 函数举例吧。

htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE,
    ?string $encoding = null,
    bool $double_encode = true
): string

htmlspecialchars() 的函数原型的参数分为两大类,一类是没有默认值的,比如 string $string,另一类是有默认值的,比如 int $flags。 我们把没有默认值的这些参数,叫做 必须参数,意思是在调用的时候必须传参,否则会报错。有默认值的则叫做 可选参数,因为有默认值,所以调用的时候可传也可以不传参数。

看起来很简单,实际上也是很简单,定义函数的时候,只有一个规则: 所有的可选参数必须在必需参数之后声明 。 也就是下面这样是不行的

其实这个规则也不是官方提的,这个规则主要是由调用的规则衍生出来的。

htmlspecialchars(
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE,
    string $string,
    ?string $encoding = null,
    bool $double_encode = true
): string

好了,函数声明这块我们已经了解了,那么回到函数调用上来,有了必须参数和可选参数的概念后,函数调用就多了几个规则了

  1. 必须参数必须传值。 也就是下面这样是不行的

    htmlspecialchars();
    
  2. 所有的参数,传值的时候必须按照定义顺序一个一个传,不能跳过中间的某个参数。 也就是说下面这样是不行的

    htmlspecialchars($string,'UTF-8', false);
    

    因为一旦跳过了某个参数,那么传递的值就是错的,比如上面的 'UTF-8' 实际上是传给了 $flags

  3. 对于默认参数,我们可以携带变量名的情况下,有选择性的传递。 这个是 PHP8 中新出的规则,也就是如果我们只想给 $double_encode 传递参数,可以这样调用

    htmlspecialchars($string,double_encode:false);
    

    这种有选择性的传递参数方式就叫做 命名参数。其实就是把函数声明中的变量名去掉 $ 然后再加上 : 后面跟着要传递的值。

  4. 命名参数传值必须在所有传值的最后出现,不能插队

    htmlspecialchars($string,double_encode:false,ENT_QUOTES | ENT_SUBSTITUTE);
    

    上面这种方式就不行了,虽然按照字面理解,我们都知道啥意思,但是官方规定的,也没办法。

    其实官方解析器可以识别这样的,但是这样写真的不要太糟糕,可能喝个咖啡的功夫,自己都忘记了后面那个 ENT_QUOTES | ENT_SUBSTITUTE 是啥意思了

  5. 必须参数也可以用命名参数方式传递,但要注意,一旦开始命名参数传递,那么之后的所有必须参数都必须用命名参数传递的方式

    htmlspecialchars(string:$string,double_encode:false);
    
  6. 对了对了,还有一条,就是 几个命名参数本身顺序无所谓。 即将下面这样也是可以的

    htmlspecialchars(double_encode:false,string:$string);
    

    因为命名参数的作用,本身就是解决一些默认参数不想传值的问题,所以就顺序反着随便来。但是,不建议这么做,因为影响代码的阅读性

其实,命名参数还有很多其它知识点,有空我们就来一个 命名参数 进阶的解析

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.