PHP中使用__call和__callStatic动态创建方法

 
更多

如何防止调用不存在的方法而出错,这里介绍一下使用__call魔术重载方法的使用,通过该方法,我们可以动态的创建一些特殊用途的方法。

__call方法原型如下:

mixed __call(string $name,array $arguments)

当调用一个不可访问的方法(如未定义,或者不可见时), __call()就会被调用。

其中$name参数是要调用的方法名称.$arguments参数是一个数组,包含者要传递给方法的参数。

如下所示:

<?php

class HandsonBoy {

    public function __call($name, $arguments) {
        switch (count($arguments)) {
            case 2:
                echo $arguments[0] * $arguments[1], PHP_EOL;
                break;
            case 3:
                echo array_sum($arguments), PHP_EOL;
                break;
            default:
                echo '参数不对', PHP_EOL;
                break;
        }
    }
}

$a = new HandsonBoy();
$a->make(5, 6);//结果输出:30

以上代码模拟了类似其他语言中的根据参数类型进行重载,跟__call配套的魔方方法是__callStatic 。

当然,使用魔术方法”防止调用不存在的方法面报错”,并不是魔术方法的本质。实际上,魔术方法使得方法的动态创建变为可能。

这在MVC等框架设计中是很有用的语法,假设一个控制器调用了不存在的方法,那么只要定义了__call魔术方法,就能很友好地处理这种情况。

以下代码通过使用_callStatic这一魔术方法进行方法的动态创建和延迟绑定,实现一个简单的ORM模型:

<?php

abstract class ActiveRecord {

    protected static $table;
    public $select;

    static function __callStatic($method, $args) {
        $field = preg_replace('/^findBy(\w*)$/', '$1', $method);
        $query = "SELECT * FROM " . static::$table . " WHERE " .self::uncamelize($field) . "='$args[0]'";
        return self::createDomain($query);
    }

    private static function createDomain($query) {
        $class = get_called_class();
        $domain = new $class();
        $domain->select = $query;

        return $domain;
    }

    private static function uncamelize($camelCaps, $separator = '_') {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
    }
}

class User extends ActiveRecord {
    protected static $table = 'user';
}

echo '<pre>';
print_r(User::findByUserName('phpernote')->select);
//输出:SELECT * FROM user WHERE user_name='phpernote'
打赏

本文固定链接: https://www.cxy163.net/archives/3425 | 绝缘体

该日志由 绝缘体.. 于 2018年08月12日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: PHP中使用__call和__callStatic动态创建方法 | 绝缘体
关键字: , , , ,

PHP中使用__call和__callStatic动态创建方法:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter