如果我拥有的是类名的字符串,如何从类中调用静态方法?

Jam*_*ore 43 php

我怎样才能得到这样的东西?

$class_name = 'ClassPeer';
$class_name::doSomething();
Run Code Online (Sandbox Code Playgroud)

jim*_*myi 64

根据PHP的版本:

call_user_func(array($class_name, 'doSomething'));
call_user_func($class_name .'::doSomething'); // >5.2.3
Run Code Online (Sandbox Code Playgroud)

  • 只是需要这个功能,OP的问题的第一个评论是正确的 - 你可以只调用`$ class_name :: method()`,它的工作原理.不幸的是,PHPStorm不同意并强调它是一个警告...... (4认同)
  • @jimyi,哪个更快? (2认同)

小智 16

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

$class_name = 'ClassPeer';

$r = new \ReflectionClass($class_name );

// @param ClassPeer $instance

$instance =  $r->newInstanceWithoutConstructor();

//$class_name->doSomething();
$instance->doSomething();
Run Code Online (Sandbox Code Playgroud)

基本上我们在这个类的实例上调用静态方法.

  • 如果我能给你更多的赞成,我愿意. (3认同)

Tos*_*kan 11

这些答案都已经过时了:

<?php

class MyTest{
    
    public static function bippo(){
        echo "hello";
    }
}

$a = MyTest::class;
$a::bippo();
Run Code Online (Sandbox Code Playgroud)

工作正常


tj1*_*111 10

使用call_user_func.另请阅读PHP callbacks.

call_user_func(array($class_name, 'doSomething'), $arguments);
Run Code Online (Sandbox Code Playgroud)


Max*_*oom 5

在我几乎错过了 VolkerK 提供的最简单的解决方案之后,我决定扩展它并将其放在帖子中。这是调用实例类上的静态成员的方法

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

// using class static member
foreach ($className::$fields as $field) {
  :
}
Run Code Online (Sandbox Code Playgroud)