PHP $this變數一些理解_PHP教程

來源:互聯網
上載者:User
本文章晉級人各位同學介紹關於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...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.