__toString()和__invoke()
__toString()用于定义输出对象引用时调用 常用于打印一些对象的信息必须有返回值,比如使用echo打印对象时。如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not bconverted to string in
__toString()用于定义输出对象引用时调用 常用于打印一些对象的信息必须有返回值,比如使用echo打印对象时。如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not bconverted to string in
<?php
class MagicTest{
//__tostring会把在对象转换为string的时候自动调用,
public function __tostring(){
return "This is the Class MagicTest";
}
//__invoke会在把对象当做一个方法调用的时候自动调用
public function ___invoke($x){
echo "__invoke called with parameter".$x."\n";
}
}
$obj = new MagicTest();
echo $obj."\n";//把对象转换问string的时候自动调用
$obj(5);//当做方法调用
?>
结果输出:
This is the Class MagicTest
__invoke called with parameter5
__call()和__callStatic()
__call()方法:当程序试图调用不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数。__call()方法包含两个参数,即方法名和方法参数,其中,方法参数是以数组形式存在的。
这两个方法在PHP里面也被称为方法的重载(overloading)
-注意区分重写(overwrite)
-通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现
<?php
class MagicTest。
//方法的重载
//当调用当前环境下未定义或不可见的类属性或方法时,<span style="font-size:12px;">PHP会先调用__call()方法来存储方法名及其参数。</span>
//这个方法的参数第一个就是调用的方法的名称,第二个参数就是调用的参数组成的数组
public function __call($name,$arguments){
echo "Calling".$name."with paramentrs:".
implode(",",$arguments)."\n";
}
//静态方法的重载,注意这个方法需要设定为static
public static function __callStatic($name,$arguments){
echo "Static Calling".$name."with paramentrs:".
implode(",",$arguments)."\n";
}
}
$obj = new MagicTest();
$obj->runTest("part1","part2");
MagicTest::runTest("part1","part2");
?>
结果输出:
CallingrunTestwith paramentrs:part1,part2
Static CallingrunTestwith paramentrs:part1,part2
克隆对象__clone()方法
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。在PHP4中我们使用“clone”这个关键字克隆对象;
PHP4定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属 性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, “__clone()”方法可以没有参数,它自 动包含$this和$that两个指针, $this指向复本,而$that指向原本;<?php
class Person{
//下面是人的成员属性
public $name;
public $sex;
public $age;
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name,$sex,$age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//这个人可以说话的方法,说出自己的属性
public function say(){
echo "我的名字是:".$this->name."性别:".$this->sex."年龄".$this->age."<br/>";
}
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法
function __clone(){
//$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
$this->name="我是假的 $this->name";
$this->age=30;
}
}
$p1=new Person('张三','男','20');
$p2=clone $p1;
$p1->say();
$p2->say();
输出结果:
我的名字是:张三性别:男年龄20
我的名字是:我是假的 张三性别:男年龄30