2014-01-23 4 views
0

Я написал следующий синглтон.Странное поведение при доступе к частному атрибуту

class Singleton { 
    // object instance 
    private static $instance; 

    private function __construct() {} 

    private function __clone() {} 
    private $val = 'he'; 

    public static function getInstance() { 
     if (self::$instance === null) { 
      self::$instance = new Singleton(); 
      self::$instance->val .= 'llo'; 
     } 
     return self::$instance; 
    } 

    public function doAction() { 
     echo $this->val; 
    } 
} 
Singleton::getInstance()->doAction(); 

Когда я получаю экземпляр, я добавляю 'llo' в частный атрибут val. И посмотрите «привет» вместо «он», почему я могу получить доступ к частному методу?

+0

Вы спрашиваете, почему это разрешено изменять частную собственность '$ instance-> val' от статического' GetInstance() '? –

+0

, где вы можете получить доступ к «частному методу», если у вас нет частных методов? – voodoo417

+0

@Michael Berkowski, yes – user1156168

ответ

1

Доступ к закрытому пространству, если для всего класса. Это не ограничивается частными/защищенными/общедоступными методами. Таким образом, вы можете получить доступ к любому частному члену из класса, но не извне класса.

  • частный сфера, когда вы хотите, чтобы ваша переменная/функция будет видна только его собственный класс.
  • protected область действия, если вы хотите сделать свою переменную/функцию видимой во всех классах, расширяющих текущий класс, включая родительский класс.
  • public scope, чтобы сделать эту переменную/функцию доступной из любого места, других классов и экземпляров объекта.

Вы можете прочитать подробности из http://php.net/manual/en/language.oop5.visibility.php

class Singleton { 
    // object instance 
    private static $instance; 

    private function __construct() {} 

    private function __clone() {} 
    private $val = 'he'; 

    public static function getInstance() { 
    if (self::$instance === null) { 
     self::$instance = new Singleton(); 
     self::$instance->val .= 'llo'; // Inside the same class you can access private variable 
    } 
    return self::$instance; 
    } 

    public function doAction() { 
    echo $this->val; 
    } 
} 
Singleton::getInstance()->doAction(); 
echo Singleton::getInstance()->val; // can't access 
Смежные вопросы