巧妙的重载魔术方法__call()
下面步入真题,说说如何巧妙的运用php的魔术方法,我相信这个在大多数项目中会用到。
先说明一下,这个小技巧我在项目中已经有很好的应用了,给我们项目带来了很大的方便,在这里先卖卖关子,您不妨继续往下看。
在项目中,可配的配置信息一定大量存在,比如说一个游戏的机器人开放时间段、支付方式的开启与否、商城显示title的配置等等,这些配置信息一般有一个特点就是没有特定的规则,而且产品运营可以随时的给据实际情况去修改,这些信息怎么保存呢,肯定不会每种类型都去建一张表,这样做简直就是费力不讨好,你想下,也许一张表中就保存了一条信息,所以得想想其他的方法,虽然这些信息没有规则,但是他们却有一个特点就是不会有太多,而且一般情况下数组就可以保存所有需要配置的信息,因此用json字符串存储信息是个不错的选择,当需要使用的时候直接取出json_decode这样就可以直接使用了,下面看看具体怎么巧妙的利用php的魔术方法实现的。
这里你先要了解下php的一个魔术方法__call(),查下php官方的文档,是这样解释这个函数的
public mixed __call ( string $name , array $arguments ) __call() is triggered when invoking inaccessible methods in an object context.
意思就是说当在一个对象中调用一个不可访问的方法(没有权限、不存在)时会触发这个函数,函数的参数$name是调用的函名,$arguments是调用的函数参数数组。看看下面这个例子:
class Test { public function __call($name, $arguments) { echo "你调用了一个不存在的方法:\r"; echo "函数名:{$name}\r"; echo "参数: \r"; print_r($arguments); } } $T = new Test(); $T->setrobottime("12", "18");
这个函数会输出下面的结果
你调用了一个不存在的方法: 函数名:setrobottime 参数: Array ( [0] => 12 [1] => 18 )
这样,我们就可以不去直接定义函数,而是用这个特性去做一些事情了。下面看看代码的实现思路,主要是思路,其中有些我是假设的,就像数据库连接,这里不主要讲这个。
class Config { /** * 这里假定下数据库表名为 * config.config, * 字段为: * config_key varchar(50), * config_value text, * primary key(config_key) * * 数据库连接为$link * 插入方法封装为query * 获取一条信息方法封装为getOne */ /** * 要进行的操作 */ private static $keys = array( //'调用方法' => 'key', 'roboottime' => 'ROBOOTTIME', 'dailysignin' => 'DAILYSIGNIN', ); /** * 设置方法 * @param string $config_key 配置项key * @param string $config_value 配置型内容(一般为json格式) * @returne boolen true/false 插入是否成功 */ private function set($config_key, $config_value){ $sql = "insert into config.config (config_key,config_value) values ('{$config_key}','{$config_value}') on duplicate key update config_value='{$config_value}'"; return $link->query($sql); } /** * 获取值的方法 * @param $config_key 要获取的配置的key * @returne string/false json字符串/失败 */ private function get($config_key) { $sql = "select * from config.config where config_key='{$config_key}'"; if($ret = $link->getOne($sql, MYSQL_ASSOC)){ return $ret; } return false; } /** * 重载魔术方法 * @param string $name 被调用的方法名 * @param array $arguments 调用时传递的参数 * @return mixed 返回结果 */ public function __call($name, $arguments) { $act = substr($name, 0, 3); $func = substr($name, 3); if(!in_array($func, self::$keys)){ return false; } if($act == 'set') { return $this->set(self::[$func], $arguments[0]); } elseif($act == 'get') { return $this->get(self::[$func]); } return false; } }
这样,我们的就可以通过一张表存储多个信息了,调用时也很方便,只需要扩展下Config::$keys数组中的信息就可以了,这样做只是为了规范,为了可以清晰的知道哪些配置存放在了这张表中。
使用的时候可以像这样去存储和获取
$config = new Config(); $info = array("12","20"); //设置 $config->setroboottime(json_encode($info)); //获取 $config->getroboottime();
这里再说一个要注意的点,这些配置信息一般会缓存到redis中,放在数据库中只是为了防止redis挂掉之后从数据库中去恢复,这里的一般指的是那些经常去读取的信息,为了减少和db的交互,直接放在缓存中。
本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
刷新评论刷新页面返回顶部
博客园首页博问新闻闪存程序员招聘知识库
公告
Copyright ©2015 奔跑的Man
推荐阅读
-
在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
-
Matlab如何实现函数重载?Matlab实现函数重载的方法
-
方法重载和方法重写的区别
-
PHP类中的魔术方法(Magic Method)简明总结
-
巧妙调整传真机CCD器件的方法
-
android中关于call拨号功能的实现方法
-
php面向对象的方法重载两种版本比较
-
ThinkPHP查询中的魔术方法简述
-
详解Python中的__new__、__init__、__call__三个特殊方法
-
php运行出现Call to undefined function curl_init()的解决方法