php面向对象基本概念(魔法方法)__invoke() __toString() __call() __callStatic() __clone()

       __toString()和__invoke()

__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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值