想要對(duì)對(duì)象的屬性進(jìn)行一些設(shè)置,如果一個(gè)一個(gè)設(shè)置,會(huì)比較麻煩,這時(shí)可以使用對(duì)象的處理器函數(shù)__get()和__set(),不過(guò)使用這兩個(gè)方法的前提,屬性需要是protect或private的,如下例:
實(shí)例代碼如下:
- class Person
- {
- private $__data = array();
- public function __get($property)
- {
- if (isset($this->__data[$property]))
- {
- return $this->__data[$property];
- }
- else
- {
- return false;
- }
- }
- public function __set($property, $value)
- {
- $this->__data[$property] = $value;
- }
- }
__set()和__get()方法是針對(duì)protect或private屬性的,這樣可以做到在外界不能直接訪問(wèn)屬性,而通過(guò)public定義的__set()和__get()方法卻可以輕易訪問(wèn)它,同事這兩個(gè)方法對(duì)屬性的操作通用性也比較高,也可以限制對(duì)象的屬性的合法性,只有屬于$__data數(shù)組中的屬性,才可以進(jìn)行設(shè)置,可以防止外界直接對(duì)屬性進(jìn)行設(shè)置.但是使用__set()和__get()也有些不足之處.第一,這兩個(gè)方法只會(huì)捕捉私有或受保護(hù)的屬性,即是外界沒(méi)有訪問(wèn)權(quán)限的屬性,這樣php會(huì)報(bào)一個(gè)致命錯(cuò)誤;第二,這兩個(gè)方法破壞了屬性的繼承性.如果父對(duì)象中有一個(gè)__set()方法,而在子類中又實(shí)現(xiàn)了自己的__get()方法,那么對(duì)象就不會(huì)正常的運(yùn)行,因?yàn)楦笇?duì)象的__get()方法是永遠(yuǎn)調(diào)不到的,而且要想檢測(cè)重寫的屬性是否存在也不能得到的,因?yàn)樗粫?huì)調(diào)用__get()方法.見(jiàn)到有人通過(guò)實(shí)現(xiàn)__isset()和__unset()來(lái)解決上面的問(wèn)題.代碼如下:
實(shí)例代碼如下:
- public function __isset($property)
- {
- if (isset($this->data[$property]))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- public function __unset($property)
- {
- if (isset($this->data[$property]))
- {
- return unset($this->data[$property]);
- }
- else
- {
- return false;
- }
- }
使用__isset()和__unset()則能保證屬性是否真正存在,不過(guò)這兩個(gè)方法只有在PHP5.1后才有效.
新聞熱點(diǎn)
疑難解答