2012-02-02 155 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

相关问题