“__”开始类方法(PHP给我们提供),都是在某一时刻不同情况下自动调用执行的方法。
1、__tostring(),也是自动调用,在直接输出对象引用时自动调用,对象引用是一个指针,比如:$p->new person(),$p就是一个对象引用。
如果在类中定义了__tostring()方法,直接输出引用对象时,就不会产生错误,而是自动调用了__tostring()方法,输出__tostring()中的返回字符,所以__tostring()中
一定要有返回值(return).
如下:
abstract class user{
//这里定义抽象方法
//注意抽象方法没有方法体,而且方法结束使用;而不是{}
abstract function setSale();
abstract function getSale();
//这里定义__tostring方法
public function __tostring(){
return get_class($this);
}
}
2、克隆对象
在一个项目中有时候需要用到两个或者多个相同的对象,如果使用new关键字重新创建新对象,再赋上相同属性,这样比较繁琐而且易出错。
所以需要根据一个对象克隆完全一样的对象,是非常必要的,而且克隆后对象互不干扰。
在PHP5中使用clone克隆对象,PHP5定义一个特殊方法“__clone”,是在克隆对象自动调用的。用"__clone"方法建立一个与原对象拥有相同属性和方法的对象。
如果需要修改克隆对象的属性和方法,需要在“__clone”中重写原本的属性和方法。“__clone”中可以没有参数,包含$this和$that两个指针,$this指向复本,$that 指向原本。
class personP{
var $name;
var $sex;
var $age;
fucntion __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
fucntion say(){
echo "我的名字叫:".$this->name."性别是:".$this->sex."年龄是:".$this->age;
}
function __clone(){
$this->name="我是假的$this->name";
$this->sex=30;
}
}
$p1=new Person("张三", "男", 20);
$p2=clone $p1;
$p1->say();
$p2->say();
上例输出:
执行结果
我的名子叫:张三性别:男我的年龄是:20
我的名子叫:我是假的张三性别:男我的年龄是:30
3、__call()
在程序开发中,如果使用对象调用对象内部方法时,调用的方法不存在,程序就会出错,然后程序退出不继续执行。可以不可以如果调用方法不存在时,提示我们调用方法及使用的参数不存在,但程序可以继续执行。这时间就需要调用方法不存在自动调用__call()方法。
<?php
//这是一个测试的类,里面没有属性和方法
class Test{
//调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数
function __call($function_name, $args){
print "你所调用的函数:$function_name(参数:";
print_r($args);
print ")不存在!<br>n";
}
}
//产生一个Test类的对象
$test=new Test();
//调用对象里不存在的方法
$test->demo("one", "two", "three");
//程序不会退出可以执行到这里
echo "this is a test<br>";
?>
上例输出结果为:
执行结果
你所调用的函数: demo(参数:Array ( [0] => one [1] => two [2] => three ) )不存在!
this is a test.