2014-03-28 80 views
0

考慮下面的代碼,請:爲什麼未初始化的屬性在課堂上公開?

class foo { 
    function bar() { 
     $this->baz = 'hello there!'; 
    } 
} 

$f = new foo; 
$f->bar(); 
echo $f->baz; // hello there! 

爲什麼上面的代碼工作的?我的意思是我沒有初始化$baz變量,也沒有使用__get__set魔術方法。我期待它會給我錯誤,但它似乎$baz已被創建和分配public知名度。 (順便說一下,它確實在靜態上下文中有錯誤)

+0

__get&__set僅當從可見性範圍之外訪問屬性時纔會調用魔術方法。當你在課堂上分配baz時,他們不會被調用。看看http://stackoverflow.com/questions/18126801/quirky-set-magic-function –

+0

因爲PHP的設計者選擇它來創建新的屬性,如果你分配給不存在的屬性;以同樣的方式分配一個值創建一個新的局部變量,如果它尚不存在...並使其它任何東西默認情況下將不太有用 –

回答

5

誰告訴你是沒有初始化,您必須通過聲明初始化$this->baz = 'hello there!'; 這是怎麼了面向對象的概念works.You正在聲明一個類,創建者的一個實例然後訪問該函數,最後在該成員函數中回顯一個變量,這就是對象方向的工作原理...

2

這是因爲PHP的工作原理。如果設置了未初始化的屬性,即使沒有__set,也會創建它。另一方面,如果您嘗試讀取未初始化的屬性,則以警告結束。