php笔记(10)——面向对象之魔术方法

来源:互联网 发布:小猪收银系统源码 编辑:程序博客网 时间:2024/06/03 20:18

  • __tostring
  • __invoke
  • __call
  • __staticcall
  • __get
  • __set
  • __isset
  • __unset
  • __clone

__tostring()

当对象被当作字符串输出时,调用该方法。

class People{    public function __tostring(){        return 'this is a people';    }}$p1 = new People();echo $p1;

__invoke

当对象被当作方法调用时,会调用该方法

class People{    public function __invoke($x){        echo 'invoke..'.$x;    }}$p1 = new People();$p1(1);

__call()

当访问对象的方法不存在时,将会调用该方法

class People{    public function __call($name,$arguments){        echo 'call..'.$name.' with args '.implode(',',$arguments);    }}$p1 = new People();$p1->hehe('2','1');

__staticcall()

当访问类静态方法不存在时,调用该方法

class People{    public static function __callStatic($name,$arguments){        echo 'calling static function '.$name.' with args '.implode(',',$arguments);    }}People::hehe('1','2');

__get()

当访问的属性不能正常访问时(没有该属性或者是private属性),调用该方法

class People{    public  function __get($name){        return "try to get property:".$name;    }}$obj = new People();echo $obj->name;

__set()

当要赋值的属性不能正常访问时(没有该属性或者是private属性),调用该方法

class People{    public  function __set($name,$value){        echo "try to set property:".$name ." with value:".$value;    }}$obj = new People(); $obj->name = '11';

__isset()

当不可访问属性调用isset()和empty() 方法时,将会调用。

class People{    public  function __isset($name){        echo "calling isset ".$name ;        return true;//return false;    }}$obj = new People();isset($obj->name);
class People{    public  function __isset($name){        echo "calling isset ".$name ;        return true;//return false;    }}$obj = new People();empty($obj->name);

__unset()

当不可访问属性调用unset() 方法时,将会调用。

class People{    public  function __unset($name){        echo "calling unset ".$name ;        return true;//return false;    }}$obj = new People();unset($obj->name);

__clone()

如下的代码,如果直接使用赋值符号,那么两个变量p1和p2其实是指向同一个对象,如果修改p2,那么p1也会被修改

class People{    public $name;}$p1 = new People();$p1->name = "name1";$p2 = $p1;$p2->name = "name2";echo "p1's name:".$p1->name.'<br>';echo "p2's name:".$p2->name;

这里写图片描述

我们可以使用clone关键字,复制一个对象(内存中重新开辟一个空间)

class People{    public $name;}$p1 = new People();$p1->name = "name1";$p2 = clone $p1;$p2->name = "name2";echo "p1's name:".$p1->name.'<br>';echo "p2's name:".$p2->name;

这里写图片描述

在使用clone的时候,就会调用__clone()方法

class People{    public $name;    function __clone(){        echo "calling clone<br>";        //可以在此处修改克隆后的值        $this->name = '111';    }}$p1 = new People();$p1->name = "name1";$p2 = clone $p1;echo "p1's name:".$p1->name.'<br>';echo "p2's name:".$p2->name;
0 0