当我想使用变量静态访问类JSON时,它是可能的。
代码:
<?php
$classname = "JSON";
$classname::echo_output();
?>
但是当我想使用一个对象变量来静态访问它时,它失败了。 代码:
<?php
class someclass{
public $classname = "JSON";
public function __construct(){
$this->classname::echo_output();
}
}
?>
亲自试试。
我是如何解决它的是$ classname = $ this-&gt; classname; 但还有其他可能的方法来解决这个问题吗?
答案 0 :(得分:2)
您可以使用call_user_func功能来实现此目的
<?php
class someclass{
public $classname = "JSON";
public function __construct(){
call_user_func([$this->classname, 'echo_output']);
}
}
?>
答案 1 :(得分:0)
如果echo_output实际存在于您的调用类中,这应该可以,但您必须先将属性赋值给变量。
public function __construct(){
$classname = $this->classname;
$classname::echo_output();
}
答案 2 :(得分:0)
通过PHP 5.4+,您可以在一行中使用ReflectionClass
执行此操作。
(new \ReflectionClass($this->classname))->getMethod('echo_output')->invoke(null);
PHP 5.4下的
call_user_func(array($this->classname, 'echo_output'));
但我不推荐这个。
您应该创建实例,注入它们并调用它们的方法,而不是使用静态方法......
interface Helper{
public function echo_output();
}
class JSONHelper implements Helper {
...
}
class someclass{
public function __construct(Helper $helper){
$helper->echo_output();
}
}
new someclass(new JSONHelper()); //multiple instances
new someclass(JSONHelper::getInstance()); //singleton
new someclass($helperFactory->createHelper()); //factory
new someclass($container->getHelper()); //IoC container
答案 3 :(得分:0)
通过一些研究和javascript知识,这个解决方案将是最简单的。
<?php
class someclass{
public $classname = "JSON";
public function __construct(){
$that = (array) $this;
$that["classname"]::echo_output();
}
}
?>
只需将对象强制转换为数组。
这样您就不必为每个动态类名定义变量。