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

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);    }}

关键字:php, 拦截器, oop

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部