Блокировка членов класса в PHP - PullRequest
0 голосов
/ 24 декабря 2008

В PHP, если вы определяете класс, а затем создаете экземпляр объекта этого класса, позже можно произвольно добавить новых членов в этот класс. Например:

class foo {
    public $bar = 5;
}

$A = new foo;
$A->temp = 10;

Тем не менее, мне бы хотелось, чтобы таким образом было невозможно добавлять новых участников. По сути, я хочу, чтобы у класса были ТОЛЬКО члены, указанные в его определении; если вы попытаетесь установить какие-либо другие члены, это фатально ошибки. Намерение здесь состоит в том, что я хочу определить класс как очень специфический набор свойств и убедиться, что ТОЛЬКО эти свойства существуют в классе, так что содержимое класса четко определено и не может измениться позже (значения каждого члена может меняться, но не сами участники).

Я понимаю, что могу сделать это с помощью метода __set и просто получить фатальную ошибку, если вы попытаетесь установить элемент, который еще не существует, но это раздражает необходимость включать его в каждое определение класса (хотя я мог бы определить каждый из моих классов расширяет базовый класс этим методом, но это тоже раздражает). E.g.:

class foo {
    public $bar = 5;

    private function __set($var, $val) {
        trigger_error("Cannot dynamically add members to a class", E_USER_ERROR);
    }
}

Есть ли другой (желательно более удобный) способ сделать это? Кроме модификации самого PHP, чтобы запретить это поведение?

Ответы [ 3 ]

4 голосов
/ 24 декабря 2008

Нет. Нет лучшего способа, чем __set в базовом классе - пока. Это известная проблема, и в будущем планируется ее решение :

Ввести понятие «строгих классов», которые не позволяют создавать динамические свойства

2 голосов
/ 24 декабря 2008

Нет, только __set. Возможно, вы можете использовать наследование, чтобы не переписывать его везде.

0 голосов
/ 24 декабря 2008

Я должен спросить, зачем тебе это нужно? Если член назначен и не существует, он не влияет на методы, а если он является закрытым, он выдаст ошибку. Так зачем вам это делать, или я полностью неправильно понял вопрос?

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