Метод __set () дважды отображает значение свойства

Я новичок в мире php. Я пытаюсь понять, как __задавать() Волшебный метод работает в php. Здесь я создаю новое свойство, используя __задавать() У меня есть оператор if, который проверяет, существует ли свойство уже или нет. Если его нет, то оно создает свойство и присваивает ему значение. Здесь я проверяю два свойства. $ newProp а также $ anotherProp. $ newProp не существует. Так что он создает свойство и повторяет его значение дважды. Но для $ anotherProp,который уже существует, еще условие Я не столкнулся с двумя проблемами

1. Это повторяет значение свойства дважды.

2. Еще условие не работает вообще. Я имею в виду, если свойство уже
существует не печатает ни одного сообщения.

      class myclass {

public $anotherProp='Another property value';

public function __set($prop,$val){
if(! property_exists($this,$prop) ){

$this->prop=$val;
echo $this->prop;

}else{
echo 'property already exists';
}
}
}

$obj=new myclass();

$obj->newProp='i am a new property';

$obj->anotherProp='i am another property';

2

Решение

В вашем __set() вы случайно еще создаете другой public свойство называется $this->prop неявно, потому что вы не используете переменную $prop определить, какое свойство получает свое значение. Последующее echo произошло дважды, потому что это еще не созданное свойство называется __set(),

использование $this->$prop чтобы решить эту часть, и взглянуть на PHP документация по «переменным переменным», где вы найдете примеры для переменных свойств объекта.

public function __set($prop, $val) {
if (!property_exists($this, $prop)) {
// Set the property dynamically
$this->$prop = $val;
echo $this->$prop;
}
else {
echo 'property already exists';
}
}

Теперь причина, по которой вы не видите property already exists при вызове $anotherProp это потому что __set() называется для недоступных свойств. это не призвал к объявленным свойствам public, Если вы вместо этого объявите

private $anotherProp = 'i am another property';

вы увидите __set() метод называется и уже существует сообщение распечатано.

Вот и всё в действии

3

Другие решения

Во-первых, у вас есть опечатка там

$this->prop = $val;

должно быть

$this->$prop = $val;

$this->prop означает «свойство этого, чье имя« prop »» (= прямая ссылка). $this->$prop означает «свойство этого, имя которого хранится в $ prop` (= косвенная ссылка).

Во-вторых, __set вызывается только для неопределенных свойств, так что это

$obj->someExistingProp = ...

не звонит __set, Это делает ваш property_exists проверка по сути бесполезна (потому что это всегда будет false в __set).

2

По вопросам рекламы [email protected]