魔术方法总结
魔术方法总结:
1. __get() 当调用一个无权调用或不存在的属性时,__get()方法自动调用
并自动传递参数,参数:属性名;如果调用public权限的属性时,成功调用,不执行__get()。
2. __set() 当修改一个无权调用或不存在的属性时,__set()方法自动调用
并自动传参,参数:属性名和属性值。如果修改public权限的属性时,成功修改,不执行__set()。
3. __isset() 当判断一个无权调用或不存在的属性时,__isset()方法自动调用
并自动传递参数,参数:属性名;函数默认返回值为false.但可以修改返回值为真
因此,不可见的属性也可以判断为可见。如果对象属性可见,则直接返回true,不执行__isset();
4. __unset() 当删除一个无权调用或不存在的属性时,__unset()方法自动调用
并自动传递参数,参数:属性名;如果对象属性可见,则直接删除属性。
5. __call() 当动态调用失败,即动态调用一个无权调用或不存在的方法时,自动调用__call()函数
并自动传参,参数:方法名,参数数组;
6. __callStatic() 当静态调用失败,即静态调用不存在的函数或无权访问的函数时,自动调用__callStatic()。
并自动传参,参数:方法名,参数数组;
这里注意:__call(), __callStatic()跟调用的函数静态与否无关,只与调用方式有关。
1 <?php 2 class Human { 3 private $money = '100万'; 4 protected $age = 22; 5 public $name = 'lucy'; 6 public function __get($p) { 7 echo '你调用不可见属性:'.$p.'<br />'; 8 } 9 } 10 11 $lucy = new Human(); 12 echo $lucy ->aa; 13 echo $lucy ->money; 14 echo $lucy ->age; 15 16 $lucy ->a = '字母a'; 17 $lucy ->b = '字母b'; 18 print_r($lucy); 19 20 /* 21 问题: 22 在没有创建__set()方法时,a, b属性被添加上了。会造成对象属性混乱 23 如何解决?添加__set() 魔术方法 24 */ 25 echo '<hr />'; 26 //下面的类含有__set()魔术方法 27 28 class Stu { 29 private $money = '100万'; 30 protected $age = 22; 31 public $name = 'lisi'; 32 33 public function __set($a,$b){ 34 echo '你修改我的属性'.$a.'为:'.$b.'<br />'; 35 } 36 } 37 38 $lisi = new Stu(); 39 $lisi ->a = '字母a'; 40 $lisi ->b = '字母b'; 41 $lisi ->money = '1分'; 42 $lisi ->age = 1; 43 print_r($lisi); 44 45 /* 46 a,b 属性没有添加上,同时无权访问的属性没有被修改 47 这些不可见属性在被调用过程中,自动调用了__set()方法 48 */ 49 echo '<hr />'; 50 51 class Game { 52 public $name = 'torchlight2'; 53 54 protected $price = '$19'; 55 private $size = '1GB'; 56 57 public function __isset($p){ 58 echo '判断属性'.$p.'是否存在并能够访问'.'<br />'; 59 } 60 61 public function __unset($p){ 62 echo '删除属性'.$p.'<br />'; 63 } 64 } 65 66 $tl = new Game(); 67 68 if(isset($tl->name)){ 69 echo '属性'.$tl->name.'存在并可以访问<br />'; 70 } 71 72 if(isset($tl->price)){ 73 echo '属性'.$tl->price.'存在并可以访问<br />'; 74 }else{ 75 echo 'isset返回false'; 76 } 77 78 /* 79 isset() 函数所要判断的属性,无论是否可见,都返回一个布尔值。 80 如果属性不可见,那么执行自定义的isset()函数,默认返回false,但是可以在 81 isset()函数里 人为返回为真 return 1; 因此: 82 问: isset($obj->xyz) 属性,为真, 83 能说明 类声明了一个xyz属性吗? 84 答:不能 85 */ 86 87 echo '<hr />'; 88 print_r($tl); 89 unset($tl->name); //成功删除 90 print_r($tl); 91 92 unset($tl->price); //自动调用 unset() 93 unset($tl->size); //自动调用unset() 94 95 echo '<hr />'; 96 97 class Book { 98 public function hello() { 99 echo 'hello<br />'; 100 } 101 private function welcome(){ 102 echo '123'; 103 } 104 static public function sayhello(){ 105 echo '你好'; 106 } 107 108 public static function __callStatic($method,$argu) { 109 echo '你想静态调用一个不存在或不权调用的方法',$method,'<br />'; 110 echo '你调用时还传了参数<br />'; 111 print_r($argu); 112 } 113 114 public function __call($method,$argu) { 115 echo '你想动态调用一个我不存在或不权调用的方法',$method,'<br />'; 116 echo '你调用时还传了参数<br />'; 117 print_r($argu); 118 } 119 120 } 121 122 $keben = new Book(); 123 124 $keben->hello(); //hello存在 不执行 __call() 125 $keben->welcome(); //动态调用private权限函数 执行__call() 126 $keben->sayhello('a','b','c'); //sayhello存在,不执行 __call(),此处参数要加单引号 否则会识别成常量 127 Book::sayhello('a','b','c'); //sayhello存在,不执行 __call() 128 Book::hello('a','b','c'); //hello 存在 静态调用 不执行 __callStatic() 129 Book::welcome(); //静态调用private权限函数 执行__callStatic() 130 131 ?>

浙公网安备 33010602011771号