魔术方法之简单实例

来源:互联网 发布:巨人网络借壳a股上市 编辑:程序博客网 时间:2024/04/20 00:40

此文章适用于小白阅读。简单的了解php中的魔术方法的概念以及使用

<?php /**魔术方法在PHP的面向对象中,某些情况下,会自动调用的方法PHP中,都是以 __ 双下划线开头的__construct()  构造方法__destruct()  析构方法__clone()  克隆方法  当对象被克隆时候写框架时非常实用的几个魔术方法__call() 当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。返回方法名字和属性 __callstatic()__get()  读取未定义的变量(无权访问或者不存在)的值时,__get() 会被调用__set()  在给(无权操作或者不存在的变量)未定义的变量赋值时,__set() 会被调用。且自动传两个参数,属性和属性值 __isset() 判断不可访问的属性(无权访问或者不存在)时,会执行__isset(),__unset() 销毁不可访问的属性(无权访问或者不存在)是,会执行__unset()__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone() 等 方法在PHP中被称为"魔术方法"(Magic methods)。 你在命名自己的类方法时不能使用这些方法名, 除非你希望使用"魔术"功能。****//*class Human{public $age = 28;public function __clone(){echo 'kelongkaiqi';}}$lisi = new Human();$zhangsan = clone $lisi;  //kelongkaiqi*/class Human{private $money = 2258;protected $age = 28;public $name = 'xiaoming';public function __get($p){echo 'you want to '.$p.',haha';}public function __set($a, $b){echo 'you want set '.$a.' and values '.$b.'<br />';// public function __unset($m) {// echo 'you want to unset'.$m;// }}}$lisi = new Human();echo $lisi->name.'<br />'; //xiaoming//echo $lisi->age;  //权限error ,如果没有__get()echo $lisi->age.'<br />';  //you want to age,hahaecho $lisi->money.'<br />'; //you want to money,hahaecho $lisi->friend.'<br />'; //you want to friend,hahaecho '<hr />';$lisi->aaa = 111;$lisi->bbb = 222;//print_r($lisi).'<br />'; //如果没有__set(),显示$lisi中已经有了aaa和bbb的属性了/**其实对象就是属性集,在js中尤为明显但是太随便了,会导致对象属性过多,不好管理**/$lisi->ccc = 333;print_r($lisi); /*you want set ccc and values 333Human Object(    [money:Human:private] => 2258    [age:protected] => 28    [name] => xiaoming)*/echo '<hr />';$lisi->name = 'laowang';//可以操作public,没有操作__set(),而是直接修改了$lisi->money = 00000; //因为无权操作money,则调用了__set() you want setmoneyand values0print_r($lisi);//xiaoming 已经通过__set()函数修改成laowang了,只能修改public,不能修改public和protected//unset($lisi->money);echo "<hr />";class Dog{public function __unset($p){echo 'you want to unset'.$p;}public function __call($method, $argu){echo 'you want to use '.$method.'<br />';echo "and,this shuxing is";print_r($argu);}public function __callstatic($method, $argu){echo 'you want to use the static method'.$method.'<br />';echo "and,this shuxing is";print_r($argu);}/**为什么  __callstatic() 没有变色1.PHP5.3才最新添加的,所以系统还没有记录,可以修改语法文件,或者更换最新的语法文件**/}$hua = new Dog();unset($hua->leg); //you want to unsetleg 因为leg没有定义,所以调用了__unset();$hua->say(1,2,3); //you want to use say and,this shuxing isArray ( [0] => 1 [1] => 2 [2] => 3 )  //调用一个不存在的方法say,会传给__call(),并且把方法名字和属性一同显示Dog::cay('ku','daku','tongku');//you want to use the static methodcay and,this shuxing isArray ( [0] => ku [1] => daku [2] => tongku )//调用一个不存在的静态方法echo "<hr />";class TianQi{public function bj(){echo 'beijing tianqiyubao';}public function __call($method, $args){echo $method.'tianqiyubao';}}$method = $_GET['method'];$t = new TianQi();if ($method) {$t->$method(); //在地址栏输入?methd=bj  输出beijing tianqiyubao   //输入?method=tianjing 会调用__call()方法  输出tianjingtianqiyubao}


0 0