Как реализовать переменную-член только для чтения в PHP?

При попытке изменить его, выбросьте исключение.

    Я полагаю, что решение для свойств класса было бы:

    • не определять свойство с именем, которое вас интересует
    • используйте магический метод __get для доступа к этому свойству, используя «поддельное» имя
    • определите метод __set чтобы он __set исключение при попытке установить это свойство.
    • См. « Перегрузка» для получения дополнительной информации о магических методах.

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

    Например, рассмотрим этот небольшой класс:

     class MyClass { protected $_data = array( 'myVar' => 'test' ); public function __get($name) { if (isset($this->_data[$name])) { return $this->_data[$name]; } else { // non-existant property // => up to you to decide what to do } } public function __set($name, $value) { if ($name === 'myVar') { throw new Exception("not allowed : $name"); } else { // => up to you to decide what to do } } } 

    Исследуя класс и пытаясь прочитать свойство:

     $a = new MyClass(); echo $a->myVar . '<br />'; 

    Вы получите ожидаемый результат:

     test 

    При попытке написать свойство:

     $a->myVar = 10; 

    Вы получите исключение:

     Exception: not allowed : myVar in /.../temp.php on line 19 
     class test { const CANT_CHANGE_ME = 1; } 

    и вы test::CANT_CHANGE_ME его как test::CANT_CHANGE_ME

    Используйте константу. Ключевое слово const

    Я знаю, что это старый вопрос, но ответ PASCAL действительно помог мне, и я хотел немного добавить к нему.

    __get () запускает не только несуществующие свойства, но и «недоступные», например, защищенные. Это упрощает создание свойств только для чтения!

     class MyClass { protected $this; protected $that; protected $theOther; public function __get( $name ) { if ( isset( $this->$name ) ) { return $this->$name; } else { throw new Exception( "Call to nonexistent '$name' property of MyClass class" ); return false; } } public function __set( $name ) { if ( isset( $this->$name ) ) { throw new Exception( "Tried to set nonexistent '$name' property of MyClass class" ); return false; } else { throw new Exception( "Tried to set read-only '$name' property of MyClass class" ); return false; } } }