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

__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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值