我知道, include
, isset
, require
, print
, echo
,和其他一些人都没有的功能,但语言结构。
一些语言结构的需要括号,有的则没有。
require 'file.php';
isset($x);
一些有返回值,有的则没有。
print 'foo'; //1
echo 'foo'; //no return value
那么究竟是什么语言结构和内置功能之间的内部区别?
我知道, include
, isset
, require
, print
, echo
,和其他一些人都没有的功能,但语言结构。
一些语言结构的需要括号,有的则没有。
require 'file.php';
isset($x);
一些有返回值,有的则没有。
print 'foo'; //1
echo 'foo'; //no return value
那么究竟是什么语言结构和内置功能之间的内部区别?
(这是超过我的本意。请多多包涵)
大多数语言是由一种叫“语法”:语言是由几个定义良好的关键字,那你可以在语言表达构建的完整范围是从语法建立起来。
例如,假设你有一个简单的四功能算术“语言”,即只需要个位数整数作为输入,完全忽略了操作顺序(我告诉你这是一个简单的语言)。 该语言可以通过语法定义:
// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /
从这三个规则,你可以建立任何数量的单个数字输入算术表达式。 然后,你可以写这句法,打破了任何有效的投入到它的组件类型(解析器$expression
, $number
,或$operator
),并用结果的交易。 例如,表达式3 + 4 * 5
可以如下分解:
// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3 + 4 * 5
= $expression $operator (4 * 5) // Expand into $exp $op $exp
= $number $operator $expression // Rewrite: $exp -> $num
= $number $operator $expression $operator $expression // Expand again
= $number $operator $number $operator $number // Rewrite again
现在我们有一个完全解析语法,在我们定义的语言,原始的表达。 一旦我们有了这个,我们可以去通过写一个解析器找到的所有组合的结果$number $operator $number
,并吐出一个结果,当我们只有一个$number
离开。
需注意,有没有$expression
留在我们的原始表达式的最终解析的版本结构。 这是因为$expression
总是可以降低到其他的事情在我们的语言的组合。
PHP是大同小异:语言构造都被认为是相当于$number
或$operator
。 它们不能被还原成其他语言结构 ; 相反,他们是从哪个语言建立了基本单位。 功能和语言结构之间的主要区别是:直接与语言结构解析器交易。 它简化了功能于语言结构。
该语言结构可能会或可能不会需要括号和一些有返回值的原因,而其他人这样做的原因并不完全取决于PHP解析器实现的具体技术细节。 我不是在分析器是如何工作的是非常熟悉,所以我不能具体解决这些问题,但想象与此启动第二语言:
$expression := ($expression) | ...
实际上,这种语言可以自由地把它发现任何表情和摆脱周围的括号。 PHP(这里我采用纯猜测),可以使用它的语言结构类似: print("Hello")
可能会降低到print "Hello"
它的解析之前,或者反之亦然(语言定义可加圆括号以及摆脱他们的)。
这就是为什么你不能重新定义语言结构,如根echo
或print
:他们有效地硬编码到解析器,而功能映射到一组语言结构和语法分析器允许您更改该映射在编译期或运行时替换您自己的一套语言结构或表达式。
在一天结束的时候,结构和表现形式之间的内在区别是:语言结构的理解和解析器处理。 内置函数,而由语言提供的,被映射和解析之前简化为一组语言构造。
更多信息:
编辑:通过一些其他的答案的阅读,人们做出正确的点。 其中:
语言结构是由语言本身提供的(比如像“如果”,“同时”,...说明); 因此,他们的名字。
这方面的一个后果是他们的速度比预定义或用户定义的函数被调用(或使我听说/读几遍)
我不知道它是如何做,但有一点,他们可以做(因为被直接集成到langage)是“搭桥”某种错误处理机制。 例如,isset()函数可以用不存在的变量使用,而不会造成任何通知,警告或错误。
function test($param) {}
if (test($a)) {
// Notice: Undefined variable: a
}
if (isset($b)) {
// No notice
}
*请注意这不是所有语言的结构的情况下。
功能和语言结构之间的另一个区别是,其中一些可以被称为无括号,就像一个关键字。
例如 :
echo 'test'; // language construct => OK
function my_function($param) {}
my_function 'test'; // function => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
这里也一样,它并不适合所有的语言结构的情况。
我想是绝对没有办法“禁用”语言结构,因为它是语言本身的一部分。 在另一方面,大量的“内置” PHP函数是不是真的内置因为它们是通过扩展提供使得它们始终处于激活状态(但不是全部)
另一个区别是语言结构不能被用作“函数指针”(我的意思是,回调,例如):
$a = array(10, 20);
function test($param) {echo $param . '<br />';}
array_map('test', $a); // OK (function)
array_map('echo', $a); // Warning: array_map() expects parameter 1 to be a valid callback, function 'echo' not found or invalid function name
我没有任何其他的想法来参加我的脑海现在...我不知道很多关于PHP的内部......所以那将是它现在^^
如果你没有在这里得到很多答案,也许你会问这个邮件列表的内部 (见http://www.php.net/mailing-lists.php ),那里有许多PHP核心开发人员; 他们是谁的人可能会知道这些东西^^
(我用其他的答案很感兴趣,顺便说一句^^)
作为参考: 关键字和语言的列表构建在PHP
通过代码涉水后,我发现PHP的解析一些在YACC文件的语句。 因此,他们是特殊情况。
(见的Zend / zend_language_parser.y)
除此之外,我不认为还有其他差别。
您可以覆盖内置函数 。 关键字是永远。