ホームページ >バックエンド開発 >PHPチュートリアル >PHP についてのある程度の理解 $this variable_PHP チュートリアル

PHP についてのある程度の理解 $this variable_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:49:32846ブラウズ

この記事は、PHP $this 変数についての理解を紹介することを目的としています。これらの記事が役立つことを願っています。


マニュアルにある興味深い小さな例です。
http://www.php.net/manual/zh/ language.variables.basics.php

コードは次のとおりです コードをコピー

$this = 'テキスト' // エラー
; $name = 'これ';
$$name = 'text' // $this を 'text' に設定します

;

$$name をエコー;

PHP の字句解析中、$this 変数はその規則に従い、構文解析によって中間コードが生成されると、PHP カーネルは、割り当てられた中間コードを生成するときに変数の型に基づいて、それが $this 変数であるかどうかを判断します。エラーが報告されます。ここでエラーが報告されるのはなぜですか?これは特殊な変数であるため、オブジェクトのメンバー メソッドが初期化されるときに、この変数はアクティブなシンボル テーブルに追加されます。

クラスのメンバー メソッドで、-> (オブジェクト演算子): $this->property (property はプロパティの名前) を使用して、非静的プロパティにアクセスできます。

クラス定義内でメソッドが呼び出される場合、使用可能な疑似変数 $this があります。 $this は呼び出し元オブジェクトへの参照です (通常はメソッドが属するオブジェクトですが、2 番目のオブジェクトから静的に呼び出された場合は別のオブジェクトになる可能性があります)。

字句解析、構文解析、中間コード生成の際、$thisは特別な変数として存在しますが、特に中間コードを生成する際には、そのための特別な処理がコード内に満載されています。これらはすべて、この変数の使用を識別してどこかにマークするなど、後続の操作の準備です。zend_op_array 構造には、this 変数が存在するかどうかを識別するためのオペコードを格納する特別な変数 this_var があります。関数またはクラスメソッドは、中間コードを生成するときに、現在の変数がこの変数であるかどうかを判断します。

この変数には実行中に 2 つの存在状態があります。1 つはグローバルに渡される状態であり、EG(This) に保存されます。もう 1 つは現在のスコープの状態であり、this で EG(active_symbol_table) に保存されます。変数。アクティビティ シンボル テーブル)。
オブジェクト メソッドなどの op_array を実行すると、PHP カーネルはこの op_array の zendexecutedata を生成し、初期化の生成時に EG(This) が EG(active_symbol_table) に追加されます。
メソッド呼び出し中にこの変数が使用される場合、EG (active_symbol_table) の値が直接取得されます。

では、オブジェクトの EG(This) はどこで初期化されるのでしょうか?
EG(This)変数自体は、PHP実行環境を初期化する際に、他のグローバル変数(EG(scope)など)と同様にNULLに初期化されます。
オブジェクトの場合、オブジェクトを作成して呼び出すと、PHP カーネルは現在取得しているオブジェクトを EG(This) に直接割り当てます。現在取得しているオブジェクトは、新しい操作によってオブジェクトが生成されたときに作成されたオブジェクトそのものです。 。

簡単な例を次に示します:

メインプログラムフローによって生成される中間コードは次のとおりです:

コードは次のとおりです コードをコピー
クラスFoo{
パブリック $var = 10;

関数 t() {
echo $ this-> var; }

関数 t2() {
エコー33;
}
}

$foo = 新しい Foo();
$foo->t();

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632703.html技術記事この記事は、PHP の $this 変数についての理解を他の学生に紹介することを目的としています。これらの記事が役立つことを願っています。 マニュアルにある興味深い小さな例です。 http://www.php.ne...
コードは次のとおりです コードをコピー
関数名: (null)
操作数: 8
コンパイル済み変数: !0 = $foo
line # * op op fetch オペランド ext return オペランド
-------------------------------------------------- ----------------------------------
2 0 > いいえ 15 1 ZEND_FETCH_CLASS 4 :1 「フー」
                                                                                                                                       3 アサイン 4 アサイン !0, $2
16 5 ZEND_INIT_METHOD_CALL !0、't'
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   


変数の元のオブジェクト値はオペコード NEW で生まれます。代入 (ASSIGN) 後、メソッドの初期化中に変数自体が実行環境の呼び出し元に渡され、呼び出し元は呼び出し (DO_FCALL_BY_NAME) の実行時に変数を EG に渡します。 ) (This)、このメソッドの op_array が実行されるとき、現在のスコープ (zend_execute_data) の環境が初期化されるときに、EG(This) が $this 変数としてアクティブなシンボル テーブルに追加され、後続のメソッドの $this 変数は、シンボル テーブルの変数を直接取得します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。