资讯专栏INFORMATION COLUMN

PHP|基于拦截器的委托方法的实践

mylxsw / 1811人阅读

摘要:提供了内置的拦截器方法,它可以拦截发送到未定义方法和属性的消息。委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方帮忙处理请求。更进一步如果在拦截器里使用方法会更好

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代码优化— getter 和 setter

    摘要:同时也可以用来实现委托,委托是指一个对象转发一个请求给另一个对象,把请求的处理委托给另一个对象。但在继承是父类与子类的关系是固定的,而使用委托可以在运行时改变使用的对象,委托比继承具有更大的灵活性。 PHP中要实现类似于Java中的getter和setter有多种方法,比较常用的有: 直接箭头->调用属性(最常用),不管有没有声明这个属性,都可以使用,但会报Notice级别的错误 $d...

    hzc 评论0 收藏0
  • java | 什么是动态代理?

    摘要:代理模式在我们日常中很常见,生活处处有代理看张学友的演唱会很难抢票,可以找黄牛排队买嫌出去吃饭麻烦,可以叫外卖无论是黄牛外卖骑手都得帮我们干活。静态代理我还是以找黄牛帮我排队买张学友的演唱会门票的例子,写个说明。 微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和...

    fxp 评论0 收藏0
  • 探索两种优雅表单验证——策略设计模式和ES6Proxy代理模式

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 在一个Web项目中,注册,登录,修改用户信息,下订单等功能的实现都离不开提交表单。这篇文章就阐述了如何编写相对看着舒服的表单验证代码。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 ...

    qpwoeiru96 评论0 收藏0
  • 探索两种优雅表单验证——策略设计模式和ES6Proxy代理模式

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 在一个Web项目中,注册,登录,修改用户信息,下订单等功能的实现都离不开提交表单。这篇文章就阐述了如何编写相对看着舒服的表单验证代码。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 ...

    Bamboy 评论0 收藏0
  • 探索两种优雅表单验证——策略设计模式和ES6Proxy代理模式

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴。 在一个Web项目中,注册,登录,修改用户信息,下订单等功能的实现都离不开提交表单。这篇文章就阐述了如何编写相对看着舒服的表单验证代码。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 ...

    light 评论0 收藏0

发表评论

0条评论

mylxsw

|高级讲师

TA的文章

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