Недавно я изучил магические методы __get
и __set
и задавался вопросом, как на самом деле установить и получить несколько свойств в классе.
Я знаю, что он отлично работает только с одной переменной или массивом, но я не уверен в доступе к нескольким переменным.
Есть ли кто-нибудь, кто мог бы объяснить это мне?
class myMagic2 { public $data; public $name; public $age; public function __set($item, $value) { $this->item = $value; } public function __get($item){ return $this->item; } }
Есть ли способ доступа ко всем переменным ( $data
, $name
, $age
)?
Когда я работаю над проектами, у меня всегда есть такие методы:
public function __set($name, $value) { //see if there exists a extra setter method: setName() $method = 'set' . ucfirst($name); if(!method_exists($this, $method)) { //if there is no setter, receive all public/protected vars and set the correct one if found $vars = $this->vars; if(array_search("_" . $name, $vars) !== FALSE) $this->{"_" . $name} = $value; } else $this->$method($value); //call the setter with the value } public function __get($name) { //see if there is an extra getter method: getName() $method = 'get' . ucfirst($name); if(!method_exists($this, $method)) { //if there is no getter, receive all public/protected vars and return the correct one if found $vars = $this->vars; if(array_search("_" . $name, $vars) !== FALSE) return $this->{"_" . $name}; } else return $this->$method(); //call the getter return null; } public function getVars() { if(!$this->_vars) { $reflect = new ReflectionClass($this); $this->_vars = array(); foreach($reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED) as $var) { $this->_vars[] = $var->name; } } return $this->_vars; }
Поэтому с ними я даю себе свободу создавать дополнительные настройки / getter для свойств, если я хочу манипулировать ими перед тем, как писать / возвращать. Если для свойства не существует setter / getter, он возвращается к самому свойству. С помощью метода getVars () вы получаете все общедоступные и защищенные свойства из класса.
Мои свойства класса всегда определяются с помощью underscorce, поэтому вы должны, вероятно, изменить это.
Вы можете следовать этой схеме.
Примечание: в примере в сообщении магические методы не были бы вызваны для $obj->data
, $obj->name
или $obj->age
потому что эти значения, которые уже доступны как публичное свойство. Я изменил их для защиты и изменил имя, чтобы скрыть их.
<?php class myMagic2{ protected $_data; protected $_name; protected $_age; public function __set($item, $value){ switch($item){ case "data": $this->_data = $value; break; case "name": $this->_name = $value; break; case "age": $this->_age = $value; break; default: throw new Exception("Property $name does not exist."); } } public function __get($item){ switch($item){ case "data": return $this->_data; break; case "name": return $this->_name; break; case "age": return $this->_age; break; default: throw new Exception("Property $name does not exist."); break; } } }
Обычно вы делаете немного больше, а затем используете магические методы в качестве прокси для установки и получения свойств классов. Вы бы так валидировали или отфильтровывали или каким-то другим образом дополняли операцию. Если вы просто собираетесь получить или установить свойство, вы можете просто сделать свойства общедоступными и отказаться от использования магических методов.