2009-12-13 91 views
1

以下面的代碼爲例:PHP stdClass的()與__get()魔術方法

class xpto 
{ 
    public function __get($key) 
    { 
     return $key; 
    } 
} 

function xpto() 
{ 
    static $instance = null; 

    if (is_null($instance) === true) 
    { 
     $instance = new xpto(); 
    } 

    return $instance; 
} 

echo xpto()->haha; // returns "haha" 

現在,我嘗試歸檔相同的結果,但沒有必須寫xpto類。我的猜測是我應該寫這樣的事:

function xpto() 
{ 
    static $instance = null; 

    if (is_null($instance) === true) 
    { 
     $instance = new stdClass(); 
    } 

    return $instance; 
} 

echo xpto()->haha; // doesn't work - obviously 

現在,是有可能__get()魔法功能添加到stdClass的對象?我猜不是,但我不確定。

回答

4

不,這是不可能的。你不能向stdClass添加任何東西。另外,與Java不同的是,每個對象都是Object的直接或間接子類,但在PHP中並非如此。

class A {}; 

$a = new A(); 

var_dump($a instanceof stdClass); // will return false 

你真的想達到什麼目的?你的問題聽起來有點像「我想關上我的車的門,但沒有一輛車」:-)。

+0

感謝卡西,我認爲可能有一種晦澀的方式來創建某種類的lambda類,但我猜不是。謝謝您的意見。 =) –

3

該OP看起來像他們試圖使用全局範圍內的函數來實現單例模式,這可能不是正確的方法,但無論如何,關於Cassy的回答,「你不能添加任何東西到stdClass」 - 這是不正確的。

您可以通過一個簡單的值將它們添加屬性的stdClass的:

$obj = new stdClass(); 
$obj->myProp = 'Hello Property'; // Adds the public property 'myProp' 
echo $obj->myProp; 

不過,我認爲你需要PHP 5.3+,以添加方法(匿名函數/閉包),其中你可能會做下面的事情。但是,我沒有試過這個。但是,如果這確實起作用,你可以用magic __get()方法做同樣的事情嗎?

更新:正如註釋中所述,您不能以這種方式動態添加方法。指定anonymous function(PHP 5.3+)就是這樣做的,只需將函數(嚴格爲closure object)分配給公共屬性即可。

$obj = new stdClass(); 
$obj->myMethod = function($name) {echo 'Hello '.$name;}; 

// Fatal error: Call to undefined method stdClass::myMethod() 
//$obj->myMethod('World'); 

$m = $obj->myMethod; 
$m('World'); // Output: Hello World 

call_user_func($obj->myMethod,'Foo'); // Output: Hello Foo 
+1

這不起作用。您不能將方法添加到stdClass。 –

+2

這不符合描述,不,你不能用'__get'做同樣的事情。這不是你附加的方法,而是一種功能。 http://codepad.viper-7.com/nn4h0J – Ryan

+1

我確認這是行不通的,但正如注意到的那樣,這個方法是一個屬性,必須這樣使用。 – ezraspectre

相關問題