簡體   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