将call_user_func()与对象一起使用

时间:2009-12-30 09:06:30

标签: php symfony1

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

$peer = GeneralToolkit::getPeerModel($model);
//return call_user_func(get_class($peer).'::retrieveByPK',array($comment->getItemId()));
return $peer->retrieveByPK($comment->getItemId());

PS:我使用的是PHP 5.2.11

2 个答案:

答案 0 :(得分:3)

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

相当于

return $peer->retrieveByPK($comment->getItemId());

第一个参数给出了一个对象引用和一个函数名。第二个参数给出了传递给被调用函数的参数。

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

答案 1 :(得分:3)

这两个电话不一样。你在打电话:

return GeneralToolkit::retrieveByPK(array($comment->getItemId());

所以当然你会得到一个不同的答案。这是正确的代码:

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

除非'retrieveByPK'是静态的,但在这种情况下你应该使用其中一个调用(这些都做同样的事情):

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()));

因此,在这种情况下,您的错误是在调用array()而不是call_user_func()时使用call_user_func_array()

<强>解释

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

使用回调时,您还要区分静态和非静态函数。静态函数存储为字符串"ClassName::functionName"或包含两个字符串array("ClassName", "FunctionName")的数组。

非静态函数的回调始终是包含要调用的对象和函数名称为字符串的数组:array($objectInstance, "functionName)

有关详细信息,请参阅PHP Callback documentation