魔术方法总结

魔术方法总结:
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 ?>
posted @ 2012-11-15 01:27  小刘_php  阅读(154)  评论(0)    收藏  举报