2014-09-01 2 views
0

Я недавно начал ООП в PHP, и я нахожусь в концепции видимости (общедоступной, защищенной, частной). Здесь я смущен насчет защищенной видимости. Защищенные члены могут быть доступны только в объявляющих классах или подклассах или дочерних классах. У меня есть этот пример на сайте РНР:ООП-видимость в PHP

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

Вы пытаетесь получить доступ к элементу 'protected' за пределами области действия обоих классов. –

+0

'echo $ obj2-> protected; // Fatal Error' Эта строка находится за пределами обоих классов. Как это должно работать тогда? Так будет работать с общественностью таким образом –

+0

И вы сами продемонстрировали в методе 'printHello', что ваш ребенок может получить доступ к защищенному свойству родителя. –

ответ

2

Защищенные члены могут быть доступны только в объявляющий класс или подкласс или дочерний класс.

Вы должны обратить внимание на в пределах.

Вы получаете фатальную ошибку, потому что вы получаете доступ к $protected снаружи как MyClass2, так и MyClass.

В означает, что вы можете получить доступ к нему из MyClass2, как вы делаете на MyClass2::printHello() и/или MyClass::printHello() методов.

+0

Ок, спасибо, я понял, но у меня одно смешение. Можем ли мы эхо-переменные в объявляющем классе или нам нужно создать объект вне класса, а затем получить доступ к переменной класса через объект и повторить его? Это может показаться глупым, но я действительно новичок в материалах ООП. Спасибо за вашу любезную помощь. – user3224207

+0

Одним из лучших концепций ООП является [инкапсуляция] (http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29): свойства класса принадлежат к объекту, где они были объявлены, поэтому большинство время, необходимое для создания нового объекта, а затем доступа к его свойствам/методам. Я писал «большую часть времени», потому что у вас есть [статические свойства/методы] (http://php.net/manual/en/language.oop5.static.php), для которых не требуется доступ к экземпляру объекта (т. Е. 'MyClass :: $ static_property') – PauloASilva

+0

Я бы предложил вам прочитать о геттерах/сеттерах, возможно, это просветит вас. – PauloASilva

Смежные вопросы