О свойствах произвольных классов в PHP - PullRequest
0 голосов
/ 04 июня 2019

Я только что узнал, что вы можете установить любое свойство класса (если оно явно не объявлено как частное). Например:

class Test {}
$test = new Test;
$test->randomthing = 'Hello world';
var_export($test);

Прекрасно работает для установки свойства randomthing объекта $test.

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

В идеале я хотел бы иметь:

class User {
    protected $name;
}

И тогда я хочу иметь возможность установить $user->name = '', но не $user->randomthing = ''. Этот второй вызов в идеале выбрасывает исключение или что-то в этом роде.

Я пытался угадать это соглашение, просматривая «динамические свойства», но, похоже, это относится к таким вещам, как синтаксис двойного доллара, для ссылки на свойство по значению в переменной.

Итак, как вы называете это поведение? И где я могу прочитать больше об управлении (или отключении)?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

У него нет специального имени или чего-то еще, это просто присвоение свойства объекту. Это стандартный и стандартный PHP - насколько мне известно, это не то, что вы можете отключить / отключить.

Все, что мы делаем $object->newProp = 'foo' - это добавление нового ключа со значением к объекту, эта пара ключ + значение не будет доступна глобально после добавления. Это только для этого объекта. Это тот же принцип для массива:

$array = [1, 2, 3];
$array[] = 4;

Мы делаем то же самое с вашим объектом:

$object = new Class();
$object->foo = 4;
0 голосов
/ 04 июня 2019

Я бы создал "волшебную" функцию __set (), которая не устанавливает параметр, но вместо этого возвращает ошибку / предупреждение.

public function __set ( string $name , mixed $value ) {
    if( in_array( $name, [ 'various', 'valid', 'properties' ] ) ) {
        $this->$name = $value;
    } else {
        trigger_error( "Setting unknown property ".__CLASS__."->$name is not permitted." );
    }
}

https://www.php.net/manual/en/language.oop5.overloading.php#object.set

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