PHP 5.4.10 の関数と混同される言語構造のリストを送信する

WBOY
リリース: 2016-06-13 12:52:56
オリジナル
848 人が閲覧しました

関数と混同されやすい PHP 5.4.10 の言語構造のリストを投稿します
ここでは、混同されやすいものの一部のみを示します。言語構造はたくさんあるので、すべてを列挙する必要はありませんし、マニュアルを一つ一つ確認するのは面倒です。実際、zend_ language_scanner.l に定義がある限り、それは言語構造です。 if、for、class、function、global などの演算子 (PHP の開始タグと終了タグ を含む) およびこれらの演算子はすべて言語構造です。


多くの人は、次のものが関数であると誤解しています:
終了
死ぬ
戻る
エコー
印刷
評価
__halt_compiler

を含む include_once
必要です
require_once
セット

設定を解除
リスト

また、言語構造の一部である特別な定数もいくつかありますが、それらは実行時に現在の環境に従って特別に処理され、その値はローカルでのみ意味があり、グローバルでは意味がありません。

__クラス__
__TRAIT__
__機能__
__方法__
__LINE__
__ファイル__
__DIR__
__名前空間__

これらの特別な定数は実行時にバインドされます。例として __CLASS__ のバインド コードは次のとおりです。

<ST_IN_SCRIPTING>"__CLASS__" {<br />
	const char *class_name = NULL;<br />
	<br />
	if (CG(active_class_entry)<br />
		&& (ZEND_ACC_TRAIT ==<br />
			(CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) {<br />
		/* We create a special __CLASS__ constant that is going to be resolved<br />
		   at run-time */<br />
		zendlval->value.str.len = sizeof("__CLASS__")-1;<br />
		zendlval->value.str.val = estrndup("__CLASS__", zendlval->value.str.len);<br />
		zendlval->type = IS_CONSTANT;<br />
	} else {<br />
		if (CG(active_class_entry)) {<br />
			class_name = CG(active_class_entry)->name;<br />
		}<br />
		<br />
		if (!class_name) {<br />
			class_name = "";<br />
		}<br />
		<br />
		zendlval->value.str.len = strlen(class_name);<br />
		zendlval->value.str.val = estrndup(class_name, zendlval->value.str.len);<br />
		zendlval->type = IS_STRING;<br />
	}<br />
	return T_CLASS_C;<br />
}
ログイン後にコピー

__CLASS__ が初めて呼び出されるとき、名前、名前の長さ、値、タイプなど、現在の関連情報が zendval 構造体にロードされます。
コメントが表示されます: 実行時に解決される特別な __CLASS__ 定数を作成します
ただし、最初にそれを呼び出したクラスにのみバインドされ、それを継承するサブクラスは再度バインドされないことに注意してください。クラス a を作成し、その中でメソッド foo を定義し、特殊な定数 __CLASS__ を呼び出し、クラス a を継承してそのメソッドを継承するクラス b を作成すると、サブクラスから foo を呼び出すと、取得したものが親になります。クラス a の名前であり、サブクラスではありません。初期の解釈言語のほとんどはこれを処理していましたが、私は現在呼び出されているクラスに基づいて動的に再バインドする Ruby を試してみました。したがって、取得されるのはクラス b の名前です。 Pythonを試したことがないので、どう対処すればよいのかわかりません。

さらに、言語の構造と関数の間には他にも 2 つの違いがあります:
1 戻り値はありません。
2 一部の言語構造は、パラメーターを受け取るときに括弧で囲む必要はありません (すべてではありません)。たとえば、「/home/angryfrog/library/my_class.php」を含めることができます。 die と exit の後には何も必要ありません。パラメータは括弧なしで使用することもできます。ただし、eval、isset、および unset には依然として括弧が必要です。

php 言語構造
-----解決策---------共有してくれてありがとう..



について知る------解決策-------------------------------- include には戻り値がありませんか?
いつ変更されましたか?
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート