2014-02-23 71 views
0

在這個例子中;如果我打電話給wash_hands,那麼它將首先執行$this->eat(),然後$this->log()php pass函數引用另一個函數在執行時返回

但我真正想要的是$this->log首先被執行,然後$this->eat()

function log($msg,$return=null){ 
//..do some logic 

return $return; 
} 

function eat(){ 
//...start eating 
} 

function wash_hands(){ 
//...wash hands 
return $this->log('hand washed',$this->eat()); 
} 

是有辦法做到這一點,它仍然即使工作..

日誌()函數在另一類

eat()是與wash_hands同類的私有/受保護的方法嗎?

+0

如果'log'使用eat的結果作爲參數,你怎麼能先調用'log'如果'log'不需要參數爲什麼沒有你只需要調用日誌然後返回'吃'的結果? – Jim

回答

0

正如您發現的那樣,$this->eat()立即調用該方法。 Unfortunateley $this->eat不是對函數的引用,因爲語法對於屬性$eat而言是相同的。但是你可以有一個參考方法形式array($object, $method)調用變量:

$this->log('hand washed', array($this, 'eat')); 

可以這樣使用:

function log($msg,$return=null) { 
    // ... 
    // now calling the passed method 
    if (is_callable($return)) { 
     return $return(); 
    } 
} 

但是:

是有辦法要做到這一點,它仍然會工作,即使..

log()函數是在另一類

eat()是與wash_hands同類的私有/受保護的方法嗎?

如果不以某種方式公開私有函數,這是不可能的。

更新:

隨着Closure binding在PHP 5.4,你實際上可以通過私有函數:

$callback = function() { return $this->eat(); } 
$this->log('hand washed', $callback->bindTo($this)); 
0

你想可以通過簡單地調用該方法之後獲得的行爲:

function wash_hands(){ 
    //...wash hands 
    $this->log('hand washed'); 
    return $this->eat(); 
} 
相關問題