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


PHP: access static member of class from instance in local class member

我想这样做:

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成员。所以,不幸的是,我不能在f里面使用A::$var

有谁知道是否有使用PHP 5.3+的单表达式语法来做到这一点?

您正在将 A 的实例传递到 B 中,但$var是 A 的静态成员,只能使用 :: 如 A::$var 访问。

private function f() {
    echo A::$var;
}

编辑:如果要使其依赖于存储在$a中的实例,则可以执行以下操作:

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

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

$b->f();

那么也许你可以转向这样的东西?

class B extends A{
    private $a;
    public function __construct($a) {
        $this->a = $a;
    }
    public function f() {
        echo static::$var;
    }
}

以下内容将起作用,但我质疑你为什么要这样做:

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->a 执行任何操作,因为$var对类来说是静态的。

你可以写一个这样的函数:

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

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

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