17

次のようなステートメントに出くわします。

echoは言語構造ですが、print は関数であるため、戻り値があります

die言語構造です

私の質問は、これらの言語構造とは何か、さらに重要なことに、なぜそれらが必要なのかということです。

4

7 に答える 7

25

言語構造は、PHP 言語にハードコーディングされています。彼らは通常のルールでプレーしません。

たとえば、存在しない変数にアクセスしようとすると、エラーが発生します。変数にアクセスする前に変数が存在するかどうかをテストするには、isset以下を参照する必要がありemptyます。

if (isset($foo))

が通常の関数である場合、 function に渡すためにissetアクセスしているため、そこでも警告が表示されます。は言語構造であるため、これは警告をスローすることなく機能します。そのため、ドキュメントでは通常の関数と言語構造を明確に区別しています。$fooissetisset

于 2010-07-15T09:48:43.283 に答える
10

言語構造は、言語を構成するものです。「if」「for」「while」「function」などです。

「echo」、「die」、「return」などの PHP マニュアルでの言及は、これらが関数ではなく、常に関数のように動作するとは限らないことを明確にするためにあります。

「echo」を「echo()」として呼び出すことができるため、初心者を混乱させる可能性があります。そのため、彼らはマニュアルに明確な区別を付けました。誰にでも明確にするために。

関数と間違われる可能性のある言語構造の他の例としては、「array()」、「list()」、および「each()」があります。

于 2010-07-15T09:45:48.610 に答える
5

この質問に対する答えを理解するには、パーサーがどのように機能するかを理解する必要があります。言語は構文によって定義され、構文はキーワードによって定義されます。

言語構造は、PHP 言語のベースとなるコードの断片です。パーサーは、関数の代わりにそれらを直接処理します。

于 2010-07-15T10:04:23.963 に答える
3

すべての言語が関数になるわけではありません。これらの最初の関数を実装するベースがどこかにあるはずです。このベースの要素は、言語構造 (または、ビルトイン) です。それらは常に「通常の」関数のように動作するとは限りません。

于 2010-07-15T09:46:34.100 に答える
2

通常の関数を使用すると不可能なことがいくつかあります。次のスニペットを検討してください。

list($el1, $el2) = array('el1', 'el2');

それが行うことは、非連想配列から要素を取得し、list()構造で定義された変数に値を割り当てることです。

関数では単純にできません:)

より微妙な例はissetemptyです。これらは関数のように見えますが、関数だけでは不可能なことの 1 つです。「変数が未定義」または「未定義のインデックス」通知を生成しません。

于 2010-07-15T09:44:31.147 に答える
1

言語構造は複数の方法で形成でき、戻り値があります

print("asdf");可能な限りでprint "asdf";あり、1 を返します。

echo("asdf");と等しいecho "asdf;"が、戻り値はありません。

die("asdf");と等しくexit("asdf");、戻り値もありません。

于 2010-07-15T09:48:51.980 に答える