2012-08-14 70 views
2

調用關於重載的手冊,我無法掌握其中的一個線程。代碼如下:如何從非實例化類

<?php 

class a 
{ 
    function __get($v) 
    { 
     $this->$v = new $v; 
     return $this->$v; 
    } 
} 

class b 
{ 
    function say($word){ 
     echo $word; 
    } 
} 
$a = new a(); 
$a->b->say('hello world'); 

// echos 'hello world' 
?> 

正如它在註釋行中指出的那樣,它呼應了hello world。但即使b沒有被實例化,它是如何被調用的?請幫幫忙,鏈接手冊here,條目是屬於用戶名爲一下Gmail點com trash80

+2

作爲'$ A-> B'沒有定義, '$ a - > __ get('b')'被調用。然後它實例化類'b'並返回那個用於'b :: say('hello world')''的實例。像尼爾寫道。 – hakre 2012-08-14 14:09:27

回答

6

下將工作以及

$a->b

function __get('b'){ 
    $this->b = new b; 
    return $this->b; 
} 

$a->b->say('hello world')

function say('hello world'){ 
    echo 'hello world'; 
} 
4

它在A.獲取的__get方法構建的是一個神奇的方法,當你嘗試檢索時調用屬性,請參閱:documentation。 __get獲取作爲字符串訪問的屬性名稱。由於該字符串用於實例化一個類,然後返回它的工作。它能做什麼

class a 
{ 
    function __get($v) 
    { 
     $this->$v = new $v; 
     return $this->$v; 
    } 
} 

class b 
{ 
    function say($word){ 
     echo $word; 
    } 
} 

class c 
{ 
    function say($word){ 
     echo 'c: ' . $word; 
    } 
} 
$a = new a(); 
$a->b->say('hello world'); 

// echos 'hello world' 

$a->c->say('hello world'); 

// echos 'c: hello world' 
3

一個新的實例,但b 已經被實例化!

內部類a的魔法getter方法:

function __get($v) 
{ 
    $this->$v = new $v; 
    return $this->$v; 
} 

$v值是 'B',當你調用$a->b以後。這意味着行$this->$v = new $v;實際上被評估爲等於:$this->b = new b;,然後return $this->b;

因此,要回顧一下,你吸氣的通話時間評估將是這樣的:

function __get($v) 
{ 
    $this->b = new b; 
    return $this->b; 
} 
1

的__get方法是一個神奇的方法。每當你試圖在PHP中訪問一個對象的屬性,並且這個屬性沒有被定義時,__get方法就會以屬性名稱作爲參數被調用。

因此,在這種情況下,你必須:

$a->b 

b不是的$一個是我們的會員,所以__get被稱爲用b作爲參數。那麼這個被運行:

function __get($v) { 
    $this->$v = new $v; 
    return $this->$v; 
} 

代b。對於$ V,讓您得到:

$this->b = new b; 

這使得$ A->巴新B的情況下,你然後調用該說的成員函數。

2

$ B實際實例因爲屬性$ B是未定義$ a和調用$一個時 - > $ B ...它調用參數$ V = $ b中的魔術方法__get,太行

$this->$b = new $b; 

被執行。

1

在此實例:$this->$v = new $v;

細目:

創建一個目的 $一個新= A();

$b = $a->b; 

這種動態調用a::__get

function __get($v) 
{ 
    $this->$v = new $v; 
    return $this->$v; 
} 

這會返回一個b對象所以你切實做好:只要

$b->say('hello world');