资讯专栏INFORMATION COLUMN

【modernPHP专题(12)】魔术方法小结

hearaway / 2021人阅读

说明

魔术方法就是在特定场景下不需要调用而自动执行的方法。因为有魔术方法,所以我们的类可以写得很灵活~

__construct       #构造方法,在类被实例化时自动调用,一般用于初始化操作;

__destruct        #析构方法,对象被销毁时自动调用;

__clone()         #克隆方法,当对象被克隆时,将会自动调用

__get($key)       #属性获取方法,当对象要调用一个被保护或不存在的属性时,__get方法就会自动被调用,并传入调用的属性名称;

__set($key,$val)  # 属性设置方法,当对象设置一个被保护或不存在的属性时,__set会被执行,并传入要设置的属性名称和属性值,注意这里的设置令对象本身没有发生改变,除非更改操作是发生在__set方法内;但无论如何,都不可以为对象增加本来就没有的属性,只有对已有的属性进行操作;

__isset($key)     # 当用isset判断一个对象是否有这个属性,并且这个属性是被保护或者不存在时被自动执行,并传入判断的属性名称;

__unset($key)     # 同上,当用unset删除一个对象的保护属性或未存在的属性时,自动被执行;

__isset($key) #__isset方法如果返回一个为true的值时,isset的判断就会失效,不管本类有没有其判断的属性,isset都会返回真;

__call($method,$arguments)    # 当对象在调用一个被保护或不存在的方法时,会自动执行,并传入两个参数$method为方法吗,$arguments为该方法的参数数组;

__callStatic($method,$arguments)    # 当调用了类当中某个被保护或不存在的静态方法时,会自动执行,并传入两个参数$method为方法,$arguments为该方法的参数数组;注意,是静态方法,并且是php5.3新增的魔术方法;

__toString() # 输出对象引用时自动调用;

__invoke() # $obj = class();$obj()时执行该函数

__sleep() # 在类序列化时调用

__wakeup() # 在类反序列化时调用
";
  }
  
  public function __toString(){
    echo "hahaha,我是toString";
    return $this -> privateProperty;
  }
  
  public function __invoke(){
    echo "类被实例为对象后,可以直接当做方法调用,调用的就是我~";
  }

  public function func(){
    echo "这是一个普通的方法 
"; } private function privateFunc(){ echo "这是一个被保护的方法
"; } public function __destruct(){ echo "我是析构方法,在对象被销毁(代码执行完、$obj被赋值为NULL或被unset)时,我会被自动调用
"; echo "貌似对象被克隆的时候,我也会自动执行
"; } public function __clone(){ echo "我是克隆魔术方法,当对象被clone时,我会被自动执行.
"; } public function __get($key){ echo "我是__get方法,当对象调用一个被保护或不存在的属性时,我会被执行,并传入调用的属性名称 -> {$key}
"; } public function __set($key , $val){ echo "我是__set方法,当对象设置一个被保护或不存在的属性时,我会被执行,并传入要设置的属性名称->"{$key}"和属性值->"{$val}";
注意,这里的设置并没有令对象本身的属性值发生改变或增加
"; /* __set方法的使用: 1.利用本方法预留一个接口,有条件的限制类外部操作类内部被保护的属性; 2.框架中一般private一个$data的数组,用set方法对其增加数组元素,然后来操作这个数组; */ } public function __isset($key){ echo "我是__isset方法,当isset判断对象的被保护或不存在属性时,我会被执行,并传入被判断的属性名称 ->"{$key}"
注意,本方法如果返回一个为true的值时,isset的判断就会失效,不管本类有没有其判断的属性 ->"{$key}",都会返回真
"; return true; } public function __unset($key){ echo "我是__unset方法,当unset对象的被保护或不存在属性时,我会被执行,并传入要被unset的属性名称 ->"{$key}"
"; } public function __call($method , $arguments){ echo "我是__call方法,当对象在调用一个被保护或不存在的方法时,我会被调用,并传入两个参数,$method ----> "{$method}"(方法名); $arguments ---->(参数数组)"; print_r($arguments); echo "
"; } public static function __callStatic($method , $arguments){ echo "我是__callStatic方法,当调用了类当中某个被保护或不存在的静态方法时,我会被调用,并传入两个参数,$method ----> "{$method}"(方法名); $arguments ---->(参数数组)"; print_r($arguments); echo "注意:只能是类::staticMethod,并且本方法是php5.3版本才更新的"; echo "
"; } } $obj = new magic(); # __invoke $obj(); //5.3以后这样搞就等于是直接调用类里面的__invoke()方法 # __toString //如果没有__toString就会报错;Object of class magic could not be converted to string //但是有__toString方法的话,不仅toString方法会被调用,并且还会返回toString中返回的值; echo $obj; # __clone; // $obj1 = clone $obj; #__get($key)获取保护和不存在的属性↓↓; $obj->privateProperty; //调用被保护的属性; $obj->zxg; //调用不存在的属性; #__set($key,$val)设置保护和不存在的属性↓↓: print_r($obj); echo "
"; $obj->privateProperty = "通过__set方法改变了属性值;"; $obj->zxg = "xgg"; //未存在的属性; print_r($obj);//$obj本身没有发生改变,除非更改操作是发生在__set方法内;但无论如何,都不可以为对象增加属性,只有对已有的属性进行操作; echo "
"; #__isset($key)方法的使用 echo isset($obj->jyh) ? "有jyh属性(事实上是没有这个属性的,但__isset方法返回真,其就为真)" : "没有jyh属性"; echo "
"; #__unset($key)方法的使用 unset($obj->zxg); #__call($method,$arguments) $obj->privateFunc("arg1" , "arg2" , "arg3"); #__callStatic($method,$arguments) magic::zhouzhou(27 , "pig"); ?>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31446.html

相关文章

  • modernPHP专题(6)】类的延迟绑定(后期绑定)

    摘要:实例化对象里面的所在哪个类就返回哪个类。访问的是当前类有点像因为其是继承了的方法,而调用的。由此可见,他们的区别只有在继承中才能体现出来,如果没有任何继承,那么这两者是没有区别的。但如果是在静态方法内本类的话,最好还是用 以static::来调用,是在运行的那个时刻才执行绑定操作; 父类中有个方法是延迟绑定的,在子类::调用这个方法的时候它又回到调用的子类开始向上找; exampl...

    adam1q84 评论0 收藏0
  • modernPHP专题(2)】反射机制Reflection

    摘要:简介是才有的新功能,它是用来导出或提取出关于类方法属性参数等的详细信息,包括注释。 简介 PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。 class Reflection { } interface Reflector { } class ReflectionException extends Exce...

    mrli2016 评论0 收藏0
  • modernPHP专题(3)】依赖注入与服务容器

    摘要:而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。上面通过构造函数注入对象的方式,就是最简单的依赖注入当然注入不仅可以通过构造函数注入,也可以通过属性注入,上面你可以通过一个来动态为这个属性赋值。 依赖倒置和控制反转是一种编程思想,而依赖注入就是通过服务容器实现这种面向接口或者是面向抽象编程的思想 概念理解 依赖倒置原则 依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下...

    terro 评论0 收藏0
  • modernPHP专题(11)】断言ASSERT

    摘要:可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。会检查指定的并在结果为时采取适当的行动视而定。中的断言向后兼用并增强之前的的方法。它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。 简述 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特定点该...

    WalkerXu 评论0 收藏0
  • modernPHP专题(7)】生成器语法

    摘要:通过生成器来生成关联数组下面每一行是用分号分割的字段组合,第一个字段将被用作键名。正常来说,产生的是一个,它的成员变量与函数不存在别名引用关系。关键字在的版本,生成器允许从其他生成器,可迭代对象或数组通过关键字来生成对应的值输出 一般你在迭代一组数据的时候,需要创建一个数据,假设数组很大,则会消耗很大性能,甚至造成内存不足。 //Fatal error: Allowed memory ...

    jackwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<