При попытке изменить его, выбросьте исключение.
Я полагаю, что решение для свойств класса было бы:
__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; } } }