簡體   English   中英

從PHP的非靜態方法中訪問不正確的靜態屬性

[英]Accessing incorrect static property from within non static method in PHP

我在PHP中遇到了一些看起來很奇怪的事情。 我正在嘗試從非靜態方法訪問靜態屬性。 我需要使用static關鍵字來訪問此屬性,因為它在每個子類中可以具有不同的值。

但是,它根本沒有從預期的類訪問屬性,而是從調用的類訪問屬性。 在我看來,這似乎是個錯誤,但如果不是,我想知道是否有人可以向我解釋此行為,並解釋我如何訪問此靜態屬性。

我在這里的期望是,靜態屬性$ why將從類B中獲取。我感到困惑,為什么將其從類A中獲取。

<?php

error_reporting(E_ALL & ~E_STRICT);

class A
{
    public static $why = "Really don't want this value. Bug?";
    public function callB()
    {
        $B = new B;
        $B::getWhy(); // PHP Bug? 
        $B->getWhy();
        $B::getWhyStatic();
        $B::getWhyStaticSelf();
    }
}

class Base {

    protected static $why = "Don't want this value";

    public static function getWhyStatic()
    {
        echo static::$why . "<BR>\n";    
    }

    public static function getWhyStaticSelf()
    {
        echo self::$why . "<BR>\n";    
    }

    public function getWhy()
    {
        echo static::$why . "<BR>\n";
    }
}

class B extends Base
{
    protected static $why = "Want this value?";
}

$A = new A;
$A->callB();

$B::bah(); 應該是$B->bah(); ,因為bah不是靜態函數。

這並不是真正的錯誤,但更多的是結果並未在文檔中真正涵蓋。 我已經做了一些研究,自己做了一些事情,我想我已經弄明白了,但是我不能100%地確定,因為沒有官方的文字說明。

我得到的印象是,當您嘗試在實例上調用靜態方法時,這等同於使用類名,而PHP實際上會以這種方式而不是實例來調用它。 例如$B::getWhy(); B::getWhy()相同,無論您是否向其傳遞實例,核心代碼都將看到它。

您遇到的問題是您將非靜態方法稱為靜態方法。 由於方法的工作方式,它們需要一個范圍來提供諸如self$this類的東西。 現在,通過像調用靜態方法一樣調用非靜態方法,並考慮到上面有關PHP實際運行代碼的方式,唯一可用的范圍是類A的范圍,因為這就是您要使用的范圍重新調用它。 這意味着發生了后期靜態綁定,並由於范圍更改而用A::$why覆蓋了B::$why ,這正是后期靜態綁定應該實現的目標。

我希望這是有道理的,如果有任何不清楚的地方,請告訴我,我會盡力解釋。

有關更多信息,還有一個實際解決此問題的問題: 用“ ::”調用非靜態方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM