本文章晉級人各位同學介紹關於PHP $this變數一些理解,希望些文章對各位同學會有所協助。
手冊上的一個有意思的小樣本。
http://www.php.net/manual/zh/language.variables.basics.php
| 代碼如下 |
複製代碼 |
$this = 'text'; // error $name = 'this'; $$name = 'text'; // sets $this to 'text' echo $$name; |
在PHP的詞法分析時,$this變數是符合其規則的,在文法解析產生中間代碼時,PHP核心會根據變數類型在產生賦值的中間代碼時判斷是否為$this變數,如果是則報錯。這裡為什麼要報錯呢?因為this作為一個特殊的變數,在對象的成員方法等調用初始化時會將this變數添加到活動符號表。
在類的成員方法裡面,可以用 ->(對象運算子):$this->property(其中 property 是該屬性名稱)這種方式來訪問非靜態屬性。
當一個方法在類定義內部被調用時,有一個可用的偽變數 $this。$this 是一個到主叫對象的引用(通常是該方法所從屬的對象,但如果是從第二個對象靜態調用時也可能是另一個對象)。
在詞法分析、文法分析並產生中間代碼時,$this作為一個特殊的變數存在,特別是在產生中間代碼時,代碼中充斥著對於this的特殊處理。這些都是為後面的運行做準備,如識別標記出某處使用this變數,在儲存opcode的zend_op_array結構體中專門有一個變數this_var標識是否有this變數。一個函數或一個類方法都會產生一個新的zend_op_array,在產生中間代碼時,判斷當前變數是否為this變數。
this變數在執行過程中會有兩種存在狀態,一種是全域傳遞的狀態,儲存在EG(This),一種是當前範圍狀態,以this變數儲存在EG(active_symbol_table)(當前執行環境的活動符號表)。
在我們執行一個 op_array 時,比如一個對象的方法,PHP核心會給這個 op_array 產生一個 zendexecutedata ,在產生初始化時,EG(This) 會添加到EG(active_symbol_table) 。
在方法調用過程中,如果有用到this變數,則會直接取EG(active_symbol_table)的值。
那麼一個對象中的EG(This)在哪裡初始化呢?
就EG(This)變數本身來說,在我們初始化PHP的執行環境時,它和其它全域變數(如EG(scope)等)一樣都會被初始化為NULL。
對於一個對象來說,當我們建立了一個對象,調用時,PHP核心會將當前獲得的對象直接賦值給EG(This),而這個當前獲得的對象是在通過new操作產生對象時建立的對象本身。
如下這個簡單樣本:
| 代碼如下 |
複製代碼 |
class Foo { public $var = 10; function t() { echo $this->var; } function t2() { echo 33; } } $foo = new Foo(); $foo->t(); |
其主程式流程產生的中間代碼如下:
| 代碼如下 |
複製代碼 |
function name: (null) number of ops: 8 compiled vars: !0 = $foo line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 > NOP 15 1 ZEND_FETCH_CLASS 4 :1 'Foo' 2 NEW $2 :1 3 DO_FCALL_BY_NAME 0 4 ASSIGN !0, $2 16 5 ZEND_INIT_METHOD_CALL !0, 't' 6 DO_FCALL_BY_NAME 0 7 > RETURN 1this |
變數原始的對象值出生在 opcode NEW,經過了賦值(ASSIGN)後,在方法初始化時,將變數本身傳遞給執行環境的調用者,調用者又在執行調用(DO_FCALL_BY_NAME)時將變數傳遞給EG(This),當執行這個方法的op_array時,初始化當前範圍的環境(zend_execute_data)時,會將EG(This)作為$this變數添加到活動符號表,後續方法中的$this變數的使用就會直接取符號表的變數。
http://www.bkjia.com/PHPjc/632703.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632703.htmlTechArticle本文章晉級人各位同學介紹關於PHP $this變數一些理解,希望些文章對各位同學會有所協助。 手冊上的一個有意思的小樣本。 http://www.php.ne...