PHP 什么是语言构造器 什么是可变函数
今天偶然间发现水煮鱼中的PHP 中数组函数 isset 效率比 array_key_exists 更高是这么写的:
由于isset
属于php
中的语言结构,而array_key_exists
是函数,所以isset
更快。并且isset
在其他语言中也存在,更具可读性。
顿时很是疑惑——什么,isset
竟然不是函数?而至于处理效率isset
更快,倒变得不重要了(至少我一直使用isset
,几乎没有关注过array_key_exists
,具体可以见文章)
PHP.net中,也被分在Variable handling 函数
,但是其实在中间有这样一段话:
Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
PHP里有echo、print、die、require等几个特殊的关键字,虽然它们用起来像是函数,但实际上更类似于if、while这样控制语句,而不是一个函数。也就是说,当解释器遇到:
print 'Hello world';
这样的一个表达式的时候,并不会把它转换成函数调用,而是直接映射到一系列预先定义好的操作。使用语言构成的时候可以加括号,也可以不加括号,但是使用函数的时候必须加括号。
可变函数可见:http://www.php.net/manual/zh/functions.variable-functions.php
$func = 'foo';
$func(); // This calls foo()
$func = 'bar';
$func('test'); // This calls bar()
$func = 'echoit';
$func('test'); // This calls echoit()
而如果
$func = 'print';
// 这样做会产生异常,因为print不是一个函数,而是语言的构成部分
$func('hello world');
这么写的话就会导致报错了。
解释来自:http://segmentfault.com/q/1010000000188609
在PHP源码里,关于isset
是这么写的:
很明显不是函数的写法。
又长见识了。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。