В PHP, если вы определяете класс, а затем создаете экземпляр объекта этого класса, можно позже произвольно добавлять новые члены в этот класс. Например:
class foo {
public $bar = 5;
}
$A = new foo;
$A->temp = 10;
Однако я бы хотел, чтобы таким образом было невозможно добавлять новых участников. По сути, я хочу, чтобы класс имел ТОЛЬКО те члены, которые указаны в его определении; если вы попытаетесь установить какие-либо другие члены, это приведет к фатальной ошибке. Смысл здесь в том, что я хочу определить класс как очень конкретный набор свойств и убедиться, что в классе существуют ТОЛЬКО эти свойства, чтобы содержимое класса было четко определено и не могло измениться позже (значения каждого члена могут меняться, но не сами участники).
Я понимаю, что могу сделать это с помощью метода __set и просто получить фатальную ошибку, если вы попытаетесь установить член, который еще не существует, но раздражает необходимость включения в каждое определение класса (хотя я мог бы определить каждый из моих классы для расширения базового класса с помощью этого метода, но это тоже раздражает). Например.:
class foo {
public $bar = 5;
private function __set($var, $val) {
trigger_error("Cannot dynamically add members to a class", E_USER_ERROR);
}
}
Есть ли другой (желательно более удобный) способ сделать это? Помимо изменения самого PHP, чтобы запретить такое поведение?






Я должен спросить, зачем вам это нужно? Если член назначен и не существует, это не влияет на методы, а если он частный, он выдаст ошибку. Так зачем вам это делать, или я совершенно неправильно понял вопрос?
... другие люди, изменяющие этот код позже, не понимают, откуда эта загадочная переменная и для чего она нужна, потому что ее нет в определении класса. Классы должны быть точно такими, как определено в определении класса.
Это могло повлиять на сериализацию.
Нет, только __set. Возможно, вы можете использовать наследование, чтобы не переписывать его повсюду.
Нет. Нет лучшего способа, чем __set в базовом классе - пока. Это известная проблема: планируется решить в будущем:
Introduce concept of “strict classes” that do not permit dynamic property creation
Говоря более узко, я хочу избежать возможности опечаток в членах. Представьте себе класс со свойством с именем $ char_lists, а затем кто-то выполняет $ Object-> chr_lists = array (1, 2, 3). Это тихо провалилось бы, и было бы неприятно выслеживать. Или кто-то может добавить новое свойство и использовать его, но тогда ...