php对象变量作为classname

时间:2014-05-16 17:24:50

标签: php class static

当我想使用变量静态访问类JSON时,它是可能的。

代码:

<?php
$classname = "JSON";
$classname::echo_output();
?>

但是当我想使用一个对象变量来静态访问它时,它失败了。 代码:

<?php
class someclass{
public $classname = "JSON";
    public function __construct(){
        $this->classname::echo_output();
    }
}
?>

亲自试试。

我是如何解决它的是$ classname = $ this-&gt; classname; 但还有其他可能的方法来解决这个问题吗?

4 个答案:

答案 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();
    }
}
?>

只需将对象强制转换为数组。

这样您就不必为每个动态类名定义变量。