看到新房子的马路对面一家公司在招 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
好了,函数声明这块我们已经了解了,那么回到函数调用上来,有了必须参数和可选参数的概念后,函数调用就多了几个规则了
-
必须参数必须传值。 也就是下面这样是不行的
htmlspecialchars();
-
所有的参数,传值的时候必须按照定义顺序一个一个传,不能跳过中间的某个参数。 也就是说下面这样是不行的
htmlspecialchars($string,'UTF-8', false);
因为一旦跳过了某个参数,那么传递的值就是错的,比如上面的
'UTF-8'
实际上是传给了$flags
-
对于默认参数,我们可以携带变量名的情况下,有选择性的传递。 这个是 PHP8 中新出的规则,也就是如果我们只想给
$double_encode
传递参数,可以这样调用htmlspecialchars($string,double_encode:false);
这种有选择性的传递参数方式就叫做 命名参数。其实就是把函数声明中的变量名去掉
$
然后再加上:
后面跟着要传递的值。 -
命名参数传值必须在所有传值的最后出现,不能插队。
htmlspecialchars($string,double_encode:false,ENT_QUOTES | ENT_SUBSTITUTE);
上面这种方式就不行了,虽然按照字面理解,我们都知道啥意思,但是官方规定的,也没办法。
其实官方解析器可以识别这样的,但是这样写真的不要太糟糕,可能喝个咖啡的功夫,自己都忘记了后面那个
ENT_QUOTES | ENT_SUBSTITUTE
是啥意思了 -
必须参数也可以用命名参数方式传递,但要注意,一旦开始命名参数传递,那么之后的所有必须参数都必须用命名参数传递的方式。
htmlspecialchars(string:$string,double_encode:false);
-
对了对了,还有一条,就是 几个命名参数本身顺序无所谓。 即将下面这样也是可以的
htmlspecialchars(double_encode:false,string:$string);
因为命名参数的作用,本身就是解决一些默认参数不想传值的问题,所以就顺序反着随便来。但是,不建议这么做,因为影响代码的阅读性
其实,命名参数还有很多其它知识点,有空我们就来一个 命名参数 进阶的解析