2013-03-05 3 views
0

Это мой классКак частные переменные доступны?

abstract class DataStore_Adapter { 

    private $id; 

    abstract function update(); 
    abstract function insert(); 

    function __construct() { 
     $this-> id = 3; 
    } 
    function save() { 
     if(! is_null($this->id)) { 
      $this->update(); 
     } else { 
      $this->insert(); 
     } 
    } 
} 

class VS_DataStroe_Adapter extends DataStore_Adapter { 

    function __construct() { 
     parent:: save(); 
    } 
    function update() { 
     echo "successfully updated!"; 
    } 
    function insert() { 
     echo "successfully inserted!"; 
    } 
} 

$vs_data = new VS_DataStroe_Adapter(); 

Выполнение этого кода я получить результат

успешно вставлен!

и если я удалить

$ этом-> ID = 3;

от конструктора метода DataStore_Adapter и поместить его внутри функции save() это дает мне результат;

успешно обновлено!

Мне нужно разъяснение относительно этого поведения. Поскольку я объявлял $ id как приватную переменную, я знаю, что ее доступ может быть доступен только через класс DataStore_Adapter. Но когда я инициализирую его внутри метода save(), подкласс может получить доступ к его значению. Как это возможно? и почему?

+0

Где код, отображающий, что «подкласс может получить доступ к его значению»? В коде, который вы отправили, только сам класс получает доступ к его значению. – DCoder

+0

Только сам класс (т. Е. 'DataStore_Adapter') обращается к частной переменной в вашем примере? Нет проблем с доступом к частной переменной-члену внутри функции-члена ... – BenM

+0

ОК, как получилось id = null в приведенном выше примере? я думал, когда подкласс класса обращается к этому родительскому классу, каждый раз, когда конструктор DataStore_Adapter вызывается так, что id не может быть нулевым. – guitarlass

ответ

2

Частный атрибут доступен только в рамках класса, который его объявляет. Save() определяется в родительском классе (который объявляет ID), чтобы он мог получить к нему доступ.

Иными словами, private DataStore_Adapter::$id можно получить по адресу DataStore_Adapter::save(), поскольку оба они определены в одном классе. Если вы хотите делиться атрибутами или методами с помощью наследования, вы можете использовать protected.

0

при вызове родителей :: сохранить() вы вызов метода DataStore_Adapter Сохранит(), поэтому частный атрибут $ идентификатор, для экономии(), так как оба принадлежат к одному классу

0

Вы можете прочитать больше о частных и других ключевых словах here.

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