Я новичок в мире 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';
В вашем __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()
метод называется и уже существует сообщение распечатано.
Во-первых, у вас есть опечатка там
$this->prop = $val;
должно быть
$this->$prop = $val;
$this->prop
означает «свойство этого, чье имя« prop »» (= прямая ссылка). $this->$prop
означает «свойство этого, имя которого хранится в $ prop` (= косвенная ссылка).
Во-вторых, __set
вызывается только для неопределенных свойств, так что это
$obj->someExistingProp = ...
не звонит __set
, Это делает ваш property_exists
проверка по сути бесполезна (потому что это всегда будет false
в __set
).