0

我想这样做:

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

请注意,我不知道它$a是一个实例A还是另一个类,我只知道它有一个静态$var成员。所以,不幸的是,我不能使用A::$varinside f

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

4

4 回答 4

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->a 做任何特别的事情,因为 $var 对类来说是静态的。

于 2013-11-15T10:54:24.977 回答
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;
}
于 2013-11-15T10:29:42.133 回答
0

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

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

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

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

于 2013-11-15T11:58:44.817 回答
0

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

$b->f();

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

class B extends A{
    private $a;

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

    public function f() {
        echo static::$var;
    }
}
于 2013-11-15T10:42:37.433 回答