__set()与__get()
当一个类里面,属性被设置为私有属性时,这个属性是不能在外部被访问的。那么当我们又想在外部访问时该怎么办呢,我们可以用方法来实现。举例如下:
1 class Test 2 { 3 private $abc; 4 5 public function setAbc($val) 6 { 7 $this->abc=$val; 8 } 9 10 public function getAbc() 11 { 12 return $this->abc; 13 } 14 } 15 16 $test=new Test(); 17 $test->setAbc("this is abc!"); 18 var_dump($test->getAbc());
以上这个代码就可以实现在外部访问私有属性,但是如果我们的私有属性不只一个时,假如还有一个ABD,那么我们要外部访问的话,还需要再写一个专门针对ABD的方法,这样就显得很麻烦了。如何实现多个私有属性访问,而又不用一个个去写方法呢?这时候 __set跟__get就派上用场了。上面的代码就可以这样写了,举例如下:
1 class Test 2 { 3 private $abc; 4 private $abd; 5 6 public function __set($var, $val) 7 { 8 $this->$var=$val; 9 } 10 11 public function __get($var) 12 { 13 return $this->$var; 14 } 15 } 16 17 $test=new Test(); 18 $test->abc="this is private abc"; 19 echo $test->abc;
__set($var,$val):有两个参数,第一个是属性名,第二个是属性值。
__get($var):只有一个参数,属性名。
以上这段代码中,当我们给私有属性赋值时,它就会自动去执行__set()这个方法,同样的,当我们要获取属性值时,它也会自动去执__get()这个方法。访问的语法跟访问公有属性语法一样。
__isset()
__isset($var):是用来检测私有属性是否存在。只有一个参数,属性名。我们用代码来举例说明,如下:
1 class Test 2 { 3 private $abc='abc'; 4 } 5 $test=new Test(); 6 var_dump(isset($test->abc));
上面这段代执行的结果是返回布尔FALSE,虽然类里面有abc这个属性,但是它是私有属性,是不能被外部所访问的,所以返回布尔FALSE。如果要测试,我们可以在类里面加上__isset()方法,举例如下:
1 class Test 2 { 3 private $abc='abc'; 4 5 public function __isset($var) 6 { 7 return isset($this->$var)?true:false; 8 } 9 } 10 $test=new Test(); 11 var_dump(isset($test->abc));
上面这段代码执行的结果是返回布尔TRUE,当外部的isset($test->abc) 检测不到abc时,它就会自动去执行类里面的__isset()这个方法,然后返回结果。
__unset()
__unset($var):用来删除私有属性,只有一个参数,属性名。举例如下:
1 class Test 2 { 3 private $abc='abc'; 4 5 public function __unset($var) 6 { 7 echo "__unset:".$var; 8 unset($this->$var); 9 } 10 } 11 $test=new Test(); 12 unset($test->abc);
上面这段代码中,当外部的unset($test->abc)检测不到abc时,就会去执行类里面的__unset()这个方法,然后删除属性。