2014-01-23 29 views
0

在下面的代碼中,我想爲「$o」分配「新值」。所以我的預期輸出爲var_dump將是新值。但是,我的var_dump正在輸出Stackoverflow__set()返回不能分配給新變量

我知道PHP有多個變量賦值,但是有沒有辦法讓它按照我的預期工作?

編輯:有沒有辦法「繞過」默認行爲__set() void return?

<?php 

class MyTable { 

    private $name; 

    public function __set($p, $v) { 
     # $this->{$p} = $v; 

     return $this->$p(); 
    } 

    private function name() { 
     var_dump("I'm executing!"); 

     return "New Value!"; 
    } 

} 

    $oMyTable = new MyTable(); 

    $o = $oMyTable->name = 'StackOverflow'; 
    var_dump($o); 

?> 

你可以看到它住在這裏:http://3v4l.org/b5DuF

+0

非常非常奇怪的使用setter的方法。 Setter的目的是在對象內部設置一些東西,而不僅僅是將值返回給外部範圍。那麼爲什麼使用setter只是常規方法? –

+0

設置一個變量的返回值將是對象本身,在我的真實代碼中(問題上的代碼僅僅是一個例子)。 –

回答

0

由於manual讀取..

__set的返回值(),因爲的方式處理PHP賦值運算符將被忽略。同樣,這樣的鏈接分配在一起時__get()不會被調用:

$a = $obj->b = 8; 

你可以嘗試覆蓋__set()方法帶有實驗性質的功能runkit_method_redefine(),看看是否能設法替代void返回。

查看您希望返回的結果的方法是使用call_user_func()調用__set()方法。

$oMyTable = new MyTable(); 
$o = call_user_func(array($oMyTable, '__set'), 'name', 'StackOverflow'); 
var_dump($o); 

// string(14) "I'm executing!" string(10) "New Value!" 
+0

謝謝,但正如我在我的問題中說的:'我知道PHP有多個變量賦值'。我試圖繞過這種默認行爲的另一種方式。 –

0

如果你看看在__set()魔術方法,你會看到,它返回void(沒有返回)。

你看到的是'StackOverflow'賦值給兩個變量。可能的組合和獲取將幫助你更好地實現這一點。如果你想看到解釋,我會問第二個問題。

0

基於您的評論:

謝謝,但正如我在我的問題說:我知道,PHP有多個變量賦值。我試圖繞過這種默認行爲的另一種方式。

您可以使用不同的魔術方法實現此目的:__call()

看看下面的代碼是有道理的:

<?php 
class MyTable 
{ 
    private $name; 

    public function __call($name, $argument) 
    { 
     return $this->$name(); 
    } 

    private function name() 
    { 
     var_dump('Im executing!'); 
     return 'New Value'; 
    } 
} 
$oMyTalbe = new MyTable(); 
$o = $oMyTable->name('StackOverflow'); 
var_dump($o); 

我一直在努力,你的風格複製上面cloecly儘可能爲便於閱讀。