Php 对对象使用call_user_func()

Php 对对象使用call_user_func(),php,symfony1,Php,Symfony1,以下两个语句应该是相同的,但是注释掉的语句不起作用。有人能解释一下吗 $peer = GeneralToolkit::getPeerModel($model); //return call_user_func(get_class($peer).'::retrieveByPK',array($comment->getItemId())); return $peer->retrieveByPK($comment->getItemId()); PS:我正在使用PHP5.2.11 r

以下两个语句应该是相同的,但是注释掉的语句不起作用。有人能解释一下吗

$peer = GeneralToolkit::getPeerModel($model);
//return call_user_func(get_class($peer).'::retrieveByPK',array($comment->getItemId()));
return $peer->retrieveByPK($comment->getItemId());
PS:我正在使用PHP5.2.11

return call_user_func(
    array($peer,'retrieveByPK'),
    $comment->getItemId()
);
相当于

return $peer->retrieveByPK($comment->getItemId());
第一个参数提供对象引用和函数名。第二个参数给出传递给被调用函数的参数


语法用于引用类的静态方法和属性。这与引用非静态方法和属性不同。

这两个调用不同。您的电话是:

return GeneralToolkit::retrieveByPK(array($comment->getItemId());
所以你当然会得到不同的答案。这是正确的代码:

return call_user_func(array($peer, 'retrieveByPK'), $comment->getItemId());
除非'retrieveByPK'是静态的,但是在这种情况下,您应该使用其中一个调用(这些调用都做相同的事情):

因此,在这种情况下,错误在于调用
call\u user\u func()
时使用
array()
,而不是调用
call\u user\u func\u array()

说明:

类有两种主要类型的函数:静态和非静态。在普通代码中,使用
ClassName::functionName()
调用静态函数。对于非静态函数,首先需要使用
$objectInstance=new ClassName()
创建一个对象,然后使用
$objectInstance->functionName()
调用该函数

在使用回调时,还需要区分静态函数和非静态函数。静态函数存储为字符串
“ClassName::functionName”
或包含两个字符串的数组
数组(“ClassName”、“functionName”)

非静态函数的回调总是一个数组,包含要调用的对象和作为字符串的函数名:
数组($objectInstance,“functionName)


有关更多详细信息,请参阅。

这是错误的。retrieveByPk在工作示例中不是静态函数。Matjis是正确的,您的代码不起作用,并且您提供的第二个解决方案没有回答我原来的问题。是的,我对问题有点误解。更新了我的答案以反映这一点。您的代码是正确的(我尝试过)。但是,我仍然不明白我的注释行如何与您编写的行等效。我认为get_类($peer)将以字符串形式返回对等类的名称,然后将其附加到“::retrieveByPK”字符串以完成方法名称。请解释为什么get_类($peer)返回“GeneralToolkit”-或者您犯了错误吗?事实证明,这同样有效:返回调用用户函数(数组(get_类($peer),“retrieveByPK”),$comment->getItemId();从您的示例中,我们无法确定get_类($peer)确实返回GeneralToolkit,但是如果你有symfony的经验,我想这是可能的。如果是真的,这是我不知道的。
return call_user_func(
    get_class($peer) . '::retrieveByPK', 
    $comment->getItemId());

return call_user_func(
    array(get_class($peer), 'retrieveByPK'), 
    $comment->getItemId());

return call_user_func_array(
    get_class($peer) . '::retrieveByPK', 
    array($comment->getItemId()));

return call_user_func_array(
    array(get_class($peer), 'retrieveByPK'), 
    array($comment->getItemId()));