2017-06-19 63 views
5

從PHPmannual秒款,它說:PHP後期靜態綁定範圍混亂

static:: introduces its scope.

因此我嘗試了以下例子:

class Father { 
    public function test(){ 
     echo static::$a; 
    } 
} 

class Son extends Father{ 
    protected static $a='static forward scope'; 
    public function test(){ 
     parent::test(); 
    } 
} 

$son = new Son(); 
$son->test(); // print "static forward scope" 

它可以作爲描述。但是,下面的例子將引發一個致命的錯誤:

class Father { 
    public function test(){ 
     echo static::$a; 
    } 
} 

class Son extends Father{ 
    private static $a='static forward scope'; 
    public function test(){ 
     parent::test(); 
    } 
} 

// print "Fatal erro: Cannot access private property Son::$a" 
$son = new Son(); 
$son->test(); 

我的主要問題是如何解釋這裏所說的scope?如果staticSon的範圍引入Father,那麼爲什麼私有變量仍然不可見Father

是否有兩件事variable範圍和visibility範圍?如果這聽起來很有趣,我對PHP很抱歉。

+0

你讀過這個https://stackoverflow.com/questions/1912902/what-exactly-are-late-static-bindings-in-php? –

+0

儘管'引入範圍''私人'屬性是不可見的任何其他類。 –

+0

@ ponury-kostek tks供參考。我讀過它。但我認爲我的問題與該主題不同。 – spacegoing

回答

1

這裏有兩件事情:範圍和可見性。兩者一起決定您是否可以訪問該房產。

正如您在第一次測試中發現的那樣,延遲靜態綁定可讓$aFather類的範圍中可用。這僅僅意味着變量(不一定是它的值)對於這個類是「已知的」。

可見性決定範圍內的變量是否可以被特定的類和實例訪問。私人財產僅對定義它的類可見。在您的第二個示例中,$a定義爲privateSon。無論其他班級是否知道它存在,都不能在Son之外訪問。

static使得$a屬於Father,但該屬性的可見性決定了它的值是否可以被訪問。

作爲進一步幫助理解它的測試,請嘗試使用self而不是static。你會得到一個不同的錯誤,$a不是Father的財產。