PHP: неизменные поля публичных пользователей

Мне нужно создать неизменяемый класс, который просто является контейнером поля члена. Я хочу, чтобы его поля были созданы один раз в своем конструкторе (значения должны указываться как параметры для конструктора). Я хочу, чтобы поля были общедоступными, но неизменными. Я мог бы сделать это с помощью Java, используя final ключевое слово перед каждым полем. Как это делается в PHP?

Related of "PHP: неизменные поля публичных пользователей"

Вы должны использовать __set и __get magic и объявить это свойство защищенным или закрытым:

 class Example { private $value; public function __construct() { $this->value = "test"; } public function __get($key) { if (property_exists($this, $key)) { return $this->{$key}; } else { return null; // or throw an exception } } public function __set($key, $value) { return; // or throw an exception } } 

Применение:

 $example = new Example(); var_dump($example->value); $example->value = "invalid"; var_dump($example->value); 

Вывод:

 string(4) "test" string(4) "test" 

Вы можете использовать магический метод __set() и __set() исключение, когда кто-то пытается установить свойство напрямую.

 class ClassName { public function __set($key, $value) { throw new Exception('Can't modify property directly.'); } } 

Однако это предотвратит изменение свойств независимо от того, являются ли они общедоступными или нет.

магические методы

так что вы можете сделать лучше – если у вас есть количество полей динамических полей

  class ClassName { private $fields = array(); // use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12)); // echo $cl->field_4; echo $cl->f; public function __construct($data= array()) { if (!is_array($data) || !count($data)) throw new Exception('Not enough args') foreach ($data as $key=>$val) { if (is_numeric($key)) $this->fields['field_'.$key] = $val; else $this->fields[$key] = $val; } } /* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1; public function __construct() { $ata = funcs_get_args(); if (!count($data)) throw new Exception('Not enough args') foreach ($data as $key=>$val) { if (is_numeric($key)) $this->fields['field_'.$key] = $val; else $this->fields[$key] = $val; } } */ public function __get($var) { if (isset($this->fields[$var])) return $this->fields[$var]; return false; //or throw new Exception ('Undeclared property'); } }