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

朱雀 2022-08-22 13:26 303阅读 0赞
  • __tostring
  • __invoke
  • __call
  • __staticcall
  • __get
  • __set
  • __isset
  • __unset
  • __clone

__tostring()

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

  1. class People{
  2. public function __tostring(){
  3. return 'this is a people';
  4. }
  5. }
  6. $p1 = new People();
  7. echo $p1;

__invoke

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

  1. class People{
  2. public function __invoke($x){
  3. echo 'invoke..'.$x;
  4. }
  5. }
  6. $p1 = new People();
  7. $p1(1);

__call()

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

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

__staticcall()

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

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

__get()

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

  1. class People{
  2. public function __get($name){
  3. return "try to get property:".$name;
  4. }
  5. }
  6. $obj = new People();
  7. echo $obj->name;

__set()

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

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

__isset()

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

  1. class People{
  2. public function __isset($name){
  3. echo "calling isset ".$name ;
  4. return true;//return false;
  5. }
  6. }
  7. $obj = new People();
  8. isset($obj->name);
  9. class People{
  10. public function __isset($name){
  11. echo "calling isset ".$name ;
  12. return true;//return false;
  13. }
  14. }
  15. $obj = new People();
  16. empty($obj->name);

__unset()

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

  1. class People{
  2. public function __unset($name){
  3. echo "calling unset ".$name ;
  4. return true;//return false;
  5. }
  6. }
  7. $obj = new People();
  8. unset($obj->name);

__clone()

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

  1. class People{
  2. public $name;
  3. }
  4. $p1 = new People();
  5. $p1->name = "name1";
  6. $p2 = $p1;
  7. $p2->name = "name2";
  8. echo "p1's name:".$p1->name.'<br>';
  9. echo "p2's name:".$p2->name;

这里写图片描述

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

  1. class People{
  2. public $name;
  3. }
  4. $p1 = new People();
  5. $p1->name = "name1";
  6. $p2 = clone $p1;
  7. $p2->name = "name2";
  8. echo "p1's name:".$p1->name.'<br>';
  9. echo "p2's name:".$p2->name;

这里写图片描述

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

  1. class People{
  2. public $name;
  3. function __clone(){
  4. echo "calling clone<br>";
  5. //可以在此处修改克隆后的值
  6. $this->name = '111';
  7. }
  8. }
  9. $p1 = new People();
  10. $p1->name = "name1";
  11. $p2 = clone $p1;
  12. echo "p1's name:".$p1->name.'<br>';
  13. echo "p2's name:".$p2->name;

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读