Мне нужно создать неизменяемый класс, который просто является контейнером поля члена. Я хочу, чтобы его поля были созданы один раз в своем конструкторе (значения должны указываться как параметры для конструктора). Я хочу, чтобы поля были общедоступными, но неизменными. Я мог бы сделать это с помощью Java, используя final
ключевое слово перед каждым полем. Как это делается в 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'); } }