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