Php 若我只有一个类名字符串,如何从类中调用静态方法?

Php 若我只有一个类名字符串,如何从类中调用静态方法?,php,Php,我怎样才能让这样的东西发挥作用 $class_name = 'ClassPeer'; $class_name::doSomething(); 反射(PHP5支持它)就是这样做的。阅读该页面,您应该能够了解如何像那样调用函数 $func = new ReflectionFunction('somefunction'); $func->invoke(); 使用。还可以阅读PHP 根据PHP的版本: call_user_func(array($class_name, 'doSomething

我怎样才能让这样的东西发挥作用

$class_name = 'ClassPeer';
$class_name::doSomething();
反射(PHP5支持它)就是这样做的。阅读该页面,您应该能够了解如何像那样调用函数

$func = new ReflectionFunction('somefunction');
$func->invoke();
使用。还可以阅读PHP


根据PHP的版本:

call_user_func(array($class_name, 'doSomething'));
call_user_func($class_name .'::doSomething'); // >5.2.3

要释放IDE自动完成和错误检测的功能,请使用以下命令:

$class_name = 'ClassPeer';

$r = new \ReflectionClass($class_name );

// @param ClassPeer $instance

$instance =  $r->newInstanceWithoutConstructor();

//$class_name->doSomething();
$instance->doSomething();

基本上,我们在类的一个实例上调用静态方法。

在我几乎错过了VolkerK最简单的解决方案之后,我决定对其进行扩展并将其放在一篇文章中。这是如何调用实例类上的静态成员

// calling class static method
$className = get_class($this);
$result = $className::caluclate($arg1, $arg2);

// using class static member
foreach ($className::$fields as $field) {
  :
}

如果需要调整名称空间

$call = call_user_func(array('\\App\\Models\\'.$class_name, "doSomething"));

$class_name::doSomething();对我来说很好。@VolkerK,我在尝试时遇到了一个T_PAAMAYIM_NEKUDOTAYIM错误。@VolkerK:从PHP5.3Perfect开始,这种语法就起作用了。我使用上面的第二个示例调用静态方法。谢谢jimyi@jimyi,哪个更快?我相当肯定第一个更快,因为它避免了解析字符串来检索类名和方法名。但这只是一个猜测,也许数组初始化比解析字符串花费更多的时间。只是需要这个功能,OP问题的第一条评论是正确的-你可以调用
$class\u name::method()
,它就可以工作了。不幸的是,PHPStorm不同意并将其突出显示为警告…在我遇到的一个特定案例中,类名存储在类的
常量中,不可能执行
self::classname::methodorun()
,但必须包装常量,以便在尝试执行该方法之前对其进行计算。Do
(self::CLASSNAME)::methodToRun()
;或者先将值存储在变量中。
$call = call_user_func(array('\\App\\Models\\'.$class_name, "doSomething"));