call_user_func(array(self,'method')) - 我必须为该类命名吗?

时间:2011-08-24 13:26:33

标签: php oop

在PHP中,call_user_func(array(self, 'method_name'))不起作用。 {1}}关键字无法在该上下文中使用。我需要实际包含类self的名称。

但是,如果我不在静态函数中,call_user_func(array('class_name', 'method_name'))变量在该上下文中起作用。为什么不同?

5 个答案:

答案 0 :(得分:11)

如果需要当前类上下文的名称,请使用get_class()(不带任何参数)或__CLASS __。

你已经写好了; self是一个关键字,不能用作数组中的引用(在PHP中应该使用哪种类型?)。 get_class()返回一个字符串,而array() - callback支持使用字符串作为静态调用的第一个名称。

答案 1 :(得分:3)

您可以尝试使用__CLASS__来获取班级名称。此外可以直接使用call_user_func('self::method_name'),但我没有对其进行测试,而documentation about callbacks没有对此进行任何说明。

答案 2 :(得分:2)

self只是一个未定义的常量,因此它表示'self'。所以这两个是相同的:

array(self, 'method_name');
array('self', 'method_name');

根据您使用的PHP版本,这实际上有效,请参阅Demo

如果它不适用于您的PHP版本,则可以使用以下选项:

call_user_func(array(__CLASS__, 'method_name'));

call_user_func(__CLASS__.'::method_name'));

或(如果您不需要call_user_func):

self::method_name();

答案 3 :(得分:2)

在PHP 5.3中,您可以编写call_user_func('self::method')call_user_func(array('self', 'method'))。我想后者也可以在旧版本中使用。

答案 4 :(得分:1)

从PHP 5.5开始,您可以进行[self::class, 'methodName']

::class对于具有类名(可能是本地别名)并且需要将完整的类名生成为字符串的情况非常有用。