2012-02-02 170 views
6
class example() 
{ 
    function shout($var) 
    { 
     echo 'shout'.$var; 
    } 

    function whisper($var, $bool) 
    { 
     if($bool) 
     { 
      echo $var; 
     } 
    } 
} 

$obj = new example(); 

if($var) 
{ 
    $func = $obj->shout(); 
}else 
{ 
    $func = $obj->whisper(); 
} 

我想先準備函數變量以備後用,而不是將條件放入循環中。有沒有可能的方法來做到這一點?如何將一個對象函數分配給一個變量?

+0

仔細與耳語/喊/等等的參數。你在玩庸醫般的鴨子火。 – landons 2012-02-02 06:29:56

+0

@landons我看不出有什麼「quacks-like-a-duck」的火,考慮到它(PHP)都是動態輸入的...... – 2012-02-02 06:32:06

+0

@landons真的嗎?我甚至沒有注意到它嘿 – kaz 2012-02-02 06:45:33

回答

4

你可以在一個字符串把函數名還使用回調:

if($var) 
{ 
    $func = array($obj, 'shout'); 
}else 
{ 
    $func = array($obj, 'whisper'); 
} 

隨後:

call_user_func($func); 

或:

call_user_func_array($func, $args); 
+0

@notJim,哪一個更適合使用? – kaz 2012-02-02 07:31:10

+0

@pst:這是根據[php手冊](http://php.net/manual/en/language.pseudo-types.php)的回調。@kaz:我沒有強烈的意見。我通常使用'$ obj - > $ func',除非我需要將它傳遞給其他函數。 – notJim 2012-02-02 16:23:35

+0

@notJim對我而言,這有點兒喋喋不休:我想我應該強調它(第二種方法)是「按名稱調用方法的信息元組」而不是第一類值(或回調函數):) – 2012-02-02 20:39:49

6

您可以通過名字來稱呼方法:

if($var) 
{ 
    $func = 'shout'; 
}else 
{ 
    $func = 'whisper'; 
} 

後來:

$obj->$func 

您可以

if ($var) { 
    $fn = 'shout'; 
} else { 
    $fn = 'whisper'; 
} 

$obj->$fn(); 
+3

可以(+1),但這在技術上不是問題所在:-)在Ruby和Python中,它是例如,可能獲得「綁定方法」(與對象上下文相關的函數),而C#具有可轉換爲委託的方法組(在本例中也與對象上下文關聯)。 PHP有沒有這樣的概念? (說,5.3) – 2012-02-02 06:28:06

+0

@pst我認爲沒有綁定方法的PHP對手 - 我們一直在尋找它。 PHP確實是一種古老的語言,我們只是幸運的,因爲程序員可以做很多工作,這很靈活。 – kaz 2012-02-02 06:51:58

+0

@pst:沒有。在PHP 5.3發佈之前,PHP沒有函數對象_at all_,heck,'create_function'仍然返回一個gensym,甚至沒有辦法爲任何類型的已定義函數獲取函數對象,更不用說了一種綁定方法。 – duskwuff 2012-02-02 07:22:39

相關問題