PHP 魔术方法(两个下划线开头的方法)

__set()__get()__isset()__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作。

__call()  是PHP里的一个魔术方法,当你调用一个类里的方法,而该方法又不存在里,就会自动调用__call() ;

上面__call 第一个参数$m 就是你要调用的方法 test.
第二个参数 是你调用方法传的参数 被当作数据传进来。


 
 

__toString() 如果我有一个类: class Person { private $name = ""; private $age = 0; function __construct($name = "", $age = "") { $this->name = $name; $this->age = $age; } function say() { echo "name:".$this->name."<br/>"."age:".$this->age."<br/>";  } } 现在我去实例化这个类,然后去打印这个实例: $p1 = new person("liuzy",20); echo $p1; //直接打印会出错 显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印。这时,我们可以用到__toString()方法。我们在Person类里加一个__toString()方法: function __toString() { return "I am Person,my name is ".$this->name."<br/>"; } 然后再刷新页面,发现什么了? 现在我们明白,__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息。注意:是两个下划线,方法必须有返回值。 __clone() 我们知道对象是可以直接赋值的,比如 $p2 = $p1; //这里是一个对象有两个引用 那么我执行: $p1->say(); $p2->say(); 是都可以执行的,而且效果一样。 我们还有一种方法: $p3 = clone $p1; //注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象。 同时我们在类里加入一个方法: function __clone() { $this->name = "我是副本"; //注意:这里的$this是克隆产生的对象本身,不是当前类 } 然后我们执行: $p3->say(); 打印出: name:我是副本 age:20 到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本 进行属性初始化等操作。 __call() 这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法。注意需要提前在类里 声明: function __call($fname,$argus) { echo "你调用的方法:".$fname."不存在<br/>"; echo "参数是".print_r($argus); } 声明时包含两个参数,第一个参数是string型,是调用的不存在的方法的方法名($fname),第二个参数是 array型,是调用的不存在的方法的参数($argus)。 可参照文章http://hi.baidu.com/%C2%FA%C1%B3%C3%D7%B7%B9/blog/item/efdf700295e3567c3912bba8.html __autoload() 我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include “xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include “xxx.php”。显然这样很麻烦。 __autoload()方法可以帮我们解决这个问题。 比如我们将上面的那个Person类所在的文件定义为 Person_class.php , 再新建一个php文件 test.php,编辑内容: function __autoload($calssName) { include $className."_class.php"; //看到这也许你就明白了吧?哈哈 } $p = new Person("mifan", 22); $p->say(); 这样执行该test.php页面就不会出现错误了。 __autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名。 当然,类文件的命名也是很有讲究的。最好是和类有关系,比如Person_class.php


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值