PHP 中的魔术方法——属性重载
属性重载
PHP重载:是指,使用一个对象(或类)的时候,如果访问了其并没有定义的(即不存在的)属性或方法,则会使用某些预先定义好的“特殊方法”来应对这种情况。
php中的重载,其实是一种内部“应对非法使用对象或类的措施”
__set($name,$value)该方法, 在对一个对象不存在的属性进行赋值的时候,会被自动调用
__get()该方法,在对一个对象不存在的属性进行取值的时候,会被自动调用!
__isset($name)该方法,在对一个对象不存在的属性进行isset()判断的时候,会被自动调用!
__unset($name)该方法,在对一个对象不存在的属性进行unset()操作的时候,会被自动调用!
Demo:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Test{ 2 public $p = 1; 3 public $list = array(); 4 function __set($name,$val){ 5 6 // echo "<p>你竟然在用一个不存在的属性 $name"; 7 // echo "<br>你试图给其赋值 $val"; 8 $this->list[$name] = $val; 9 } 10 function __get($name){ 11 if(!empty($this->list[$name])){ 12 return $this->list[$name]; 13 }else{ 14 return "该属性不存在"; 15 } 16 } 17 function __isset($name){ 18 if(isset($this->list[$name])){ 19 return true; 20 }else{ 21 return false; 22 } 23 } 24 function __unset($name){ 25 unset($this->list[$name]); 26 } 27 } 28 29 $t = new Test(); 30 $t->p = 11; //使用存在的属性赋值 31 $t->p2 = 22;//使用不存在存在的属性赋值 32 $t->host="localhost";//使用不存在存在的属性赋值 33 $t->port = "3306";//使用不存在存在的属性赋值 34 echo "<pre>"; 35 var_dump($t); 36 echo "</pre>"; 37 echo "<br>属性p=".$t->p; 38 echo "<br>属性p2=".$t->p2; 39 echo "<br>属性p3=".$t->p3; 40 41 echo "<br>"; 42 echo "<br>属性p是否存在?"; 43 var_dump(isset($t->p)); 44 echo "<br>属性p2是否存在?"; 45 var_dump(isset($t->p2)); 46 echo "<br>属性p3是否存在?"; 47 var_dump(isset($t->p3)); 48 49 echo "<br>"; 50 echo "<br>unset()属性p2之前<br>"; 51 print_r($t->list); 52 unset($t->p2); 53 echo "<br>unset()属性p2之后<br>"; 54 print_r($t->list);