繁体   English   中英

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,例如$:。

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()

PS。 返回字符串通常比在内部方法中回显更可取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM