web-dev-qa-db-ja.com

PHPの言語構成要素と「組み込み」関数の違いは何ですか?

includeissetrequireprintecho、および他のいくつかは関数ではなく言語構成体であることを知っています。

これらの言語構成要素には、括弧が必要なものとそうでないものがあります。

require 'file.php';
isset($x);

戻り値を持つものとそうでないものがあります。

print 'foo'; //1
echo  'foo'; //no return value

それでは、言語構成体と組み込み関数の内部の違いは何ですか?

91
Philippe Gerber

言語構成体は、言語自体によって提供されます(「if」、「while」、...などの指示のように)。したがって、その名前。

その結果の1つは、事前定義またはユーザー定義の関数よりも高速に呼び出されることです(または、何度か聞いたり読んだりしています)

私はそれがどのように行われるのか分かりませんが、彼らができることの1つは(言語に直接統合されているため)、ある種のエラー処理メカニズムを「バイパス」することです。たとえば、isset()は、通知、警告、エラーを発生させることなく、存在しない変数とともに使用できます。

function test($param) {}
if (test($a)) {
    // Notice: Undefined variable: a
}

if (isset($b)) {
    // No notice
}

*すべての言語のコンストラクトの場合ではないことに注意してください。

関数と言語構成体のもう1つの違いは、キーワードのように、それらの一部が括弧なしで呼び出せることです。

例えば ​​:

echo 'test'; // language construct => OK

function my_function($param) {}
my_function 'test'; // function => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

ここでも、すべての言語構成体に当てはまるわけではありません。

言語構成要素は言語自体の一部であるため、言語構成要素を「無効にする」方法は絶対にないと思います。一方、多くの「ビルトイン」PHP関数は、常にアクティブであるような拡張機能によって提供されるため、実際にはビルトインではありません(しかし、すべてではありません)

もう1つの違いは、言語構造を「関数ポインター」として使用できないことです(たとえば、コールバックなど)。

$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 core-developers;彼らはおそらくそのことを知っている人です^^

(そして私は他の答えに本当に興味があります、ところで^^)

参考として: PHPのキーワードと言語構成のリスト

15
Pascal MARTIN

コードを調べてみると、phpがyaccファイル内のステートメントの一部を解析していることがわかりました。したがって、それらは特別な場合です。

(Zend/zend_language_parser.yを参照)

それ以外は、他の違いはないと思います。

4
terminus

組み込み関数をオーバーライド できます。キーワードは永遠です。

1
Jason S