2016-04-07 6 views
2

Должен ли он генерировать ошибку, когда я пытаюсь установить значение свойства из расширенного класса вместо базового класса?Почему частные переменные PHP работают в расширенном классе?

<?php 
class first{ 
    public $id = 22; 
    private $name; 
    protected $email; 
    public function __construct(){ 
     echo "Base function constructor<br />"; 
    } 
    public function printit(){ 
     echo "Hello World<br />"; 
    } 
    public function __destruct(){ 
     echo "Base function destructor!<br />"; 
    } 
} 
class second extends first{ 
    public function __construct($myName, $myEmail){ 
     $this->name = $myName; 
     $this->email = $myEmail; 
     $this->reveal(); 
    } 
    public function reveal(){ 
     echo $this->name.'<br />'; 
     echo $this->email.'<br />'; 
    } 
} 
$object = new second('sth','[email protected]'); 

?> 
+3

Нет, он не может получить доступ к частной собственности в родительском классе (даже не знает, что он существует), поэтому он создает новое общедоступное свойство в расширенном классе –

+0

, просто выполните 'var_dump'' объекта $ 'Я думаю, у вас будет ответ –

ответ

1

Частные переменные недоступны в подклассах. То, что для модификатора доступа protected. Здесь произошло то, что при доступе к переменной, которая не существует, она создает один для вас с модификатором доступа по умолчанию от public.

Вот UML, чтобы показать вам состояние:

enter image description here

Обратите внимание: подкласс все еще имеет доступ ко всем public и protected методов и переменных из суперкласса - но не являются в UML схема!

+0

_Thats, что защитник доступа' protected' for._ - ... вы имеете в виду 'private'? опечатка? – Federkun

+0

@Federico no, с 'protected 'подкласс имеет доступ к переменной. С 'private' подкласс не имеет доступа. _ «Это то, что защитник доступа« защищен »для» ._ – st2erw2od

+0

в порядке, я неправильно его понял. – Federkun

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

  • Нет связанных вопросов^_^