之前對(duì)php中的魔術(shù)方法一直有了解,但是對(duì)于具體的使用場景則是模模糊糊的。今天了解到了一種使用魔術(shù)方法的場景,整理了一下寫出來。
假如一個(gè)類中具有較多的變量,對(duì)于每一個(gè)變量編寫set/get方法是一件非常繁瑣的事情,尤其對(duì)于數(shù)據(jù)庫的查詢結(jié)果,有時(shí)候字段可以很多。但是直接讓程序調(diào)用類中的字段又不被推薦,這時(shí)候可以通過對(duì)__get、__set和__call方法的使用來解決這個(gè)問題。
<?phpclass Basic { PRotected $_properties; /** * Basic constructor. * @param $val */ public function __construct ($val = array()) { $this->_properties = $val; } /** * @param $key * @param $val */ public function __set ($key, $val) { $this->_properties[$key] = $val; } /** * @param $key * @return */ public function __get ($key) { return isset($this->_properties[$key]) ? $this->_properties[$key] : null; } /** * @param $_method * @param $args * @return */ public function __call ($_method, $args) { if(method_exists($this, $_method)) { return $this->$_method($args); } if(substr($_method, 0, 3) == 'get') { return $this->_get($_method); } if(substr($_method, 0, 3) == 'set') { $this->_set($_method, $args); } return null; } /** * @param $_method * @return */ private function _get ($_method) { $_method = substr($_method, 3, strlen($_method)); $key = implode('_', preg_split('#(?=[A-Z])#', lcfirst($_method))); $key = strtolower($key); return isset($this->_properties[$key]) ? $this->_properties[$key] : null; } /** * @param $_method * @param null $args */ private function _set ($_method, $args = null) { $_method = substr($_method, 3, strlen($_method)); $key = implode('_', preg_split('#(?=[A-Z])#', lcfirst($_method))); $key = strtolower($key); $this->_properties[$key] = $args[0]; }}$student = array( 'name' => '張三', 'age' => 18, 'sex' => 'male', 'score' => 99);$basic = new Basic($student);$basic->level = 'A';var_dump($basic->name);//string(6) "張三"var_dump($basic->getLevel());//string(1) "A"$basic->setLevel('B');var_dump($basic->level);//string(1) "B"通過代碼中的方式,相當(dāng)于對(duì)于每個(gè)字段默認(rèn)實(shí)現(xiàn)了get/set方法,在對(duì)象中可以直接通過getKeyName和setKeyName方法的方式來操作對(duì)象的字段值。新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注