CodeSky 代码之空

随手记录自己的学习过程

PHP 什么是语言构造器 什么是可变函数

2014-04-26 20:17分类: PHP评论: 0

今天偶然间发现水煮鱼中的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这样控制语句,而不是一个函数。也就是说,当解释器遇到:

1print 'Hello world';
2

这样的一个表达式的时候,并不会把它转换成函数调用,而是直接映射到一系列预先定义好的操作。使用语言构成的时候可以加括号,也可以不加括号,但是使用函数的时候必须加括号。

可变函数可见:http://www.php.net/manual/zh/functions.variable-functions.php

1$func = 'foo';
2$func();        // This calls foo()
3
4$func = 'bar';
5$func('test');  // This calls bar()
6
7$func = 'echoit';
8$func('test');  // This calls echoit()
9

而如果

1$func = 'print';
2
3// 这样做会产生异常,因为print不是一个函数,而是语言的构成部分
4$func('hello world');
5

这么写的话就会导致报错了。

解释来自:http://segmentfault.com/q/1010000000188609

在PHP源码里,关于isset是这么写的:

很明显不是函数的写法。 又长见识了。

评论 (0)