巧妙的重载魔术方法__call()
工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了。大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自己,还是忍不住经常去玩,没日没夜的玩(本来就是闷骚男,还宅着玩游戏,这也是大学四年只有游戏、左右手,没有女朋友的一个原因了)。现在工作了,每天都有任务,看到旁边的牛人们在项目中如鱼得水,就有了赶超他们的想法,于是每天都会给自己一个额外的小任务去学习新的知识,到现在工作有半年了,对以前不熟悉的linux现在也可应熟悉的使用了,对不熟悉的js也有了新的认识,可以说现在我对工作可以胜任(如果分为新手、高级新手、胜任者、精通者、专家)了,开发过活动、接口、后台,也优化完善过系统的框架,只要是产品运营提出的合理需求都可以快速的支持到位。当然还确确实实的感受到一点:程序员真是一个奇怪的群体,大多时候总是会觉得自己的点子是最好的。当然这个算是自信但有时候讨论的时候你的咄咄逼人不一定是好事,所以还要多听听其他人的想法,不但可以发现自己的不足,还会建立良好的:”友谊“。跟大家瞎扯了这么多这半年的一点点感受,谢谢你可以坚持看完^_^。
下面步入真题,说说如何巧妙的运用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 = strtolower(substr($name, 3));
- if(!in_array($func, self::$keys)){
- return false;
- }
- if($act == 'set')
- {
- return $this->set(self::$keys[$name], $arguments[0]);
- }
- elseif($act == 'get')
- {
- return $this->get(self::$keys[$name]);
- }
- 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)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
巧妙的重载魔术方法__call()的更多相关文章
- php用魔术方法__call实现类函数重载
因为php是弱类型语言,不喜欢c++通过改变函数返回相同的值键入的参数的数目和功能将过载!但在需求函数的实际发展可能过载.开发需求,我们能够通过魔术方法__call()来实现函数重载. class T ...
- PHP 魔术方法 __call 与 __callStatic 方法
PHP 魔术方法 __call 与 __callStatic 方法 PHP 5.3 后新增了 __call 与 __callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会 ...
- 关于PHP魔术方法__call的一点小发现
好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...
- PHP魔术方法__call()篇
当我们调用类中的方法时,如果方法不存在的话.__call会是运行,从而使错误不显示出来 header('Content-type:text/html;charset="utf-8" ...
- PHP的重载-使用魔术方法实现
摘录PHP官网对PHP重载的解释: PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法.我们是通过魔术方法(magic method ...
- PHP常用魔术方法(__call魔术方法:)
魔术方法 __call <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload ...
- PHP 魔术方法之__set__get__unset,__isset,__call
<?php /*** 魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 PHP面向对象中,提供了这几个魔术方法, 他们的特点 都是以双下划线__开头的 __construct(), _ ...
- 魔术方法之__call与__callStatic方法
<?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...
- PHP魔术方法之__call与__callStatic方法
<?php class human{ private function t(){ } //魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ public ...
随机推荐
- Python.Django视频教程(全13集)
Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html
- Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?
现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...
- 【分布式协调器】Paxos的工程实现-cocklebur选举
其实整个项目中一个最主要的看点就是选举算法,而这部分也是逻辑最复杂最难理解的部分.不同的实现在不同的场景下的策略也不尽相同,而且场景非常之多.接下来我们一起来看一下Cocklebur的实现思路. 一个 ...
- <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向
[root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...
- NLPIR分词工具的使用(java环境下)
一.NLPIR是什么? NLPIR(汉语分词系统)由中科大张华平博士团队开发,主要功能包括:中文分词,词性标注,命名实体识别,用户词典功能,详情见官网:http://ictclas.nlpir.org ...
- android服务之MP3播放(2)
该播放器将会直接从网络上获取资源进行播放,并提供进度条显示的功能 布局文件 布局文件中使用Seekbar组件来显示进度条 <?xml version="1.0" encodi ...
- RHEL7搭建DHCP
此实验利用VMware12搭建的环境,网卡都是-自定义VMnet3 网络环境: 一台server(DHCP),两台client 其中一台当做打印机使用,固定IP(根据MAC地址) 需求描述: 1:DH ...
- 【JavaEE企业应用实战学习记录】sessionListener
package sanglp.servlet; import javax.servlet.ServletContext; import javax.servlet.annotation.WebList ...
- ViewHolder数据错乱BUG
需求是这样的,在列表中用一个图标标示某个item是已经被接下或者完成的任务. 对于文件有这样的操作,进入列表后第一页面展示正常,但是加载更多后同样位置出现了同样的标志.这不是我想要的效果 我的解决办法 ...
- 【Alpha版本】冲刺阶段——Day 6
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...