Блокировка членов класса в PHP

В 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, чтобы запретить такое поведение?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
310
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Говоря более узко, я хочу избежать возможности опечаток в членах. Представьте себе класс со свойством с именем $ char_lists, а затем кто-то выполняет $ Object-> chr_lists = array (1, 2, 3). Это тихо провалилось бы, и было бы неприятно выслеживать. Или кто-то может добавить новое свойство и использовать его, но тогда ...

dirtside 24.12.2008 04:10

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

dirtside 24.12.2008 04:10

Это могло повлиять на сериализацию.

jmucchiello 13.03.2009 16:50

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

Ответ принят как подходящий

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

Introduce concept of “strict classes” that do not permit dynamic property creation

Другие вопросы по теме