За последние 24 часа нас посетили 62123 программиста и 1791 робот. Сейчас ищет 921 программист ...

Вопрос по __set()

Тема в разделе "Прочие вопросы по PHP", создана пользователем Alimoff, 15 май 2009.

  1. Alimoff

    Alimoff Активный пользователь

    С нами с:
    27 окт 2008
    Сообщения:
    26
    Симпатии:
    0
    Здравствуйте, у меня такой вопрос:
    в классе есть public свойства, я хочу сделать так, что-бы пользователь мог только брать значение, но не мог менять свойство. Я пробовал решить проблему 2я методами
    1:
    PHP:
    1.  
    2. public function __set($name, $value)
    3. {
    4.     die('свойства нельзя изменять');
    5. }
    6.  
    2:
    PHP:
    1.  
    2. protected function __set($name, $value)
    3. {
    4.     // свойства нельзя изменять
    5. }
    6.  
    но это не работает, можете что-нибудь подсказать?
     
  2. kas1e

    kas1e Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    можно сделать внутреннюю функцию, которая вызывается в других и сверяет значение всех внутренних переменных с эталоном из массива. после работы все функции туда записывают новый эталон, но если пытаются изменить сами а потом вызвать функцию любую - будет драко )
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    __set не перехватывает обращение к public свойствам. Как вариант сделать все свойства protected и использовать пару __set/__get.
     
  4. Alimoff

    Alimoff Активный пользователь

    С нами с:
    27 окт 2008
    Сообщения:
    26
    Симпатии:
    0
    Sergey89
    Спасибо, я думал, что __set() перехватывает все обращения к свойствам.
     
  5. Alimoff

    Alimoff Активный пользователь

    С нами с:
    27 окт 2008
    Сообщения:
    26
    Симпатии:
    0
    readOnly is private и в конструкторе я заполняю в него названия protected переменных, которые можно прочесть
    PHP:
    1.  
    2.         public function __get($name)
    3.         {
    4.             if (in_array($name, $this->readOnly)) {
    5.                 return $this->$name;
    6.             }
    7.         }
    8.  
     
  6. Alimoff

    Alimoff Активный пользователь

    С нами с:
    27 окт 2008
    Сообщения:
    26
    Симпатии:
    0
    Это нормальное решение?