2014-09-01 69 views
0

我最近開始使用PHP的OOP,並使用可見性概念(public,protected,private)。在這裏,我對被保護的知名度感到困惑。受保護的成員只能在聲明類或子類或子類中訪問。我對PHP的網站這個例子:在PHP中的OOP能見度

class MyClass 
{ 
    public $public = 'Public'; 
    protected $protected = 'Protected'; 
    private $private = 'Private'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 


class MyClass2 extends MyClass 
{ 
    // We can redeclare the public and protected method, but not private 
    protected $protected = 'Protected2'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj2 = new MyClass2(); 
echo $obj2->public; // Works 
echo $obj2->protected; // Fatal Error 
echo $obj2->private; // Undefined 
$obj2->printHello(); // Shows Public, Protected2, Undefined 

在這段代碼在倒數第三行(echo $obj2->protected; // Fatal Error)它給了致命的錯誤。但是在這種情況下,被保護的變量是不是繼承到MyClass2的子類?那麼爲什麼這個致命的錯誤呢?有人可以請教我這個嗎?

+4

您正嘗試訪問兩個類範圍之外的受保護的成員。 – 2014-09-01 07:52:06

+0

'echo $ obj2-> protected; //致命錯誤'這條線在兩個類之外。它應該如何工作呢?它只能以這種方式與公衆一起工作 – 2014-09-01 07:54:31

+0

而且你已經用'printHello'方法演示了你的孩子可以訪問父母受保護的財產。 – 2014-09-01 07:55:29

回答

2

protected成員只能是聲明類或 子類或子類進行訪問。

您必須注意中的

由於您從MyClass2MyClass以外的地方訪問$protected,所以發生致命錯誤。

意味着你可以從MyClass2就像你在MyClass2::printHello()和/或MyClass::printHello()方法做訪問它。

+0

好的,謝謝,我明白了,但我有一個相關的困惑。我們是否可以在聲明類中回顯變量,或者我們必須在類之外創建對象,然後通過對象訪問類變量並對其進行回顯?這聽起來很愚蠢,但我對OOP的東西很陌生。感謝您的親切幫助。 – user3224207 2014-09-01 08:18:57

+0

關於OOP的TOP概念之一是[封裝](http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29):類的屬性屬於它們被聲明的對象,所以大部分您需要先創建一個新對象並訪問其屬性/方法的時間。我寫了「大部分時間」,因爲你有[靜態屬性/方法](http://php.net/manual/en/language.oop5.static.php),它不需要訪問對象實例(即'MyClass :: $ static_property') – PauloASilva 2014-09-01 08:38:41

+0

我建議你閱讀getters/setters,也許它會啓發你。 – PauloASilva 2014-09-01 08:42:00