PHP:从本地类成员中的实例访问类的静态成员

时间:2013-11-15 10:25:01

标签: php

我想这样做:

class A {
    public static $var = 'foo';
}

class B {
    private $a;

    public function __construct($a) {
        $this->a = $a;
    }

    public function f() {
        echo $this->a::$var; // <---- ERROR
        echo get_class($this->a)::$var; // <---- ERROR

        // WORKING but awful
        $a = $this->a;
        echo $a::$var;
    }
}

$b = new B(new A());
$b->f();

请注意,我不知道$aA的实例还是其他类,我只知道它有一个静态$var成员。所以,遗憾的是,我无法在A::$var内使用f

有没有人知道是否有单表达式语法来执行此操作,使用PHP 5.3 +?

4 个答案:

答案 0 :(得分:0)

您将A的实例传递给B,但$ var是A的静态成员,只能使用:: like A :: $ var。

进行访问。
private function f() {
    echo A::$var;
}

编辑: 如果你想让它依赖于存储在$ a中的实例,你可以做类似的事情:

public function f() {
    $class = get_class($this->a);
    echo $class::$var;
}

答案 1 :(得分:0)

我看到的第一件事是你不能调用f(),因为它是私有的。

$b->f();

那么也许你可以转向这样的事情?

class B extends A{
    private $a;

    public function __construct($a) {
        $this->a = $a;
    }

    public function f() {
        echo static::$var;
    }
}

答案 2 :(得分:0)

以下内容可行,但我会问你为什么要这样做:

class A {
    public static $var = 'foo';
}

class B {
    private $a;

    public function __construct($a) {
        $this->a = $a;
    }

    public function f() {
        if ($this->a instanceof A) {
            echo A::$var;
        }
    }
}

$b = new B(new A());
$b->f();

你不需要专门用$ this-&gt; a来做任何事情,因为$ var对于类是静态的。

答案 3 :(得分:0)

您可以编写如下函数:

function get_static_property($class, $property) {
    return $class::$$property;
}

我不禁想知道你为什么需要这个。有什么理由你不能拥有A实现接口?还是用一个特质? 这样你就可以回复$this->a->someMethodName()

PS。返回字符串通常比回显内部方法更受欢迎。