摘要:提供了内置的拦截器方法,它可以拦截发送到未定义方法和属性的消息。委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方帮忙处理请求。更进一步如果在拦截器里使用方法会更好
PHP提供了内置的拦截器方法,它可以拦截发送到未定义方法和属性的消息。也被称为重载(overloading)。
拦截器方法
__get($property) // 访问未定义的属性时被调用 __set($property, $value) // 给未定义的属性赋值时被调用 __isset($property) // 给未定义的属性调用isset()时被调用 __unset($property) // 给未定义的属性调用unset()时被调用 __call($method, $arg_array) //调用未定义的方法时被调用
PHP经常使用静态术语的表达方式(即::符号)来讨论类方法与属性,即使改方法和属性并非静态。当提及Person::$name属性时,要注意name属性不一定是静态属性,很可能需要通过对象来访问。
当创建Person对象并尝试设置一个名为Person::$name的属性时,因为这个类没有定义$name属性,所以__set()方法被调用。
__call方法对于实现委托也很有用。委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方帮忙处理请求。
举个例子
class PersonWriter { public function writeName(Person $p) { print $p->getName() . PHP_EOL; } public function writeAge(Person $p) { print $p->getAge() . PHP_EOL; } } class Person { private $writer; public function __construct(PersonWriter $writer) { $this->writer = $writer; } public function __call($methodname, $args) { if (method_exists($this->writer, $methodname)) { return $this->writer->methodname($this); } } public function getName() { return "Bob"; } public function getAge() { return 44; } }
调用
$person = new Person(new PersonWriter()); $person->writeName();
此处提供了一个动态的接口,来让Person对接PersonWriter,也是提供一种思路。
更进一步如果在拦截器里使用call_user_func()方法会更好
function __call($method, $args) { if (method_exists($this->obj, $method)) { return call_user_func_array([$this->obk, $method], $args); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21654.html
摘要:同时也可以用来实现委托,委托是指一个对象转发一个请求给另一个对象,把请求的处理委托给另一个对象。但在继承是父类与子类的关系是固定的,而使用委托可以在运行时改变使用的对象,委托比继承具有更大的灵活性。 PHP中要实现类似于Java中的getter和setter有多种方法,比较常用的有: 直接箭头->调用属性(最常用),不管有没有声明这个属性,都可以使用,但会报Notice级别的错误 $d...
摘要:代理模式在我们日常中很常见,生活处处有代理看张学友的演唱会很难抢票,可以找黄牛排队买嫌出去吃饭麻烦,可以叫外卖无论是黄牛外卖骑手都得帮我们干活。静态代理我还是以找黄牛帮我排队买张学友的演唱会门票的例子,写个说明。 微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和...
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 在一个Web项目中,注册,登录,修改用户信息,下订单等功能的实现都离不开提交表单。这篇文章就阐述了如何编写相对看着舒服的表单验证代码。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 ...
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 在一个Web项目中,注册,登录,修改用户信息,下订单等功能的实现都离不开提交表单。这篇文章就阐述了如何编写相对看着舒服的表单验证代码。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 ...
阅读 1382·2021-09-02 09:53
阅读 2656·2021-07-29 13:50
阅读 1694·2019-08-30 11:07
阅读 1554·2019-08-30 11:00
阅读 1437·2019-08-29 14:00
阅读 1786·2019-08-29 12:52
阅读 2542·2019-08-29 11:11
阅读 3399·2019-08-26 12:23