PHP中实现类似JS的链式调用(修改版)
来源:互联网 发布:网络创世纪uo主题曲 编辑:程序博客网 时间:2024/05/21 09:58
写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。
所以很多人写程序都会选择三元运算取代if..else...。
而用过JS的人应该都见识过js中的链式方法。
如 somevars.func().func2().func3()...funcN();
这样的写法使得代码更简练,并且作用关系一目了然。
那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是。
所以很多人写程序都会选择三元运算取代if..else...。
而用过JS的人应该都见识过js中的链式方法。
如 somevars.func().func2().func3()...funcN();
这样的写法使得代码更简练,并且作用关系一目了然。
那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是。
所以解决方法就是让php的变量变成一个对象。
这个适用于自己的框架方法,不适用整个php方法,因为php中的有些函数顺序不一致,而且不是对象。
代码如下:<?php error_reporting(E_ALL | E_STRICT); /** * PHP-OOP_VAR 让php的变量变成一个对象 * * @version 0.0.2 * @author jroam*/ Abstract Class Base_OOP_VAR{ /** * 追溯数据,用来进行调试 * @var array */ private $_trace_data = array(); /** * 保存可用的方法列表 * @var array */ protected $_methods = array( ); /** * 数据本身 * @var null */ public $data; /** * 初始化变量 * @param var * @return void */ public function __construct($data){ $this->data = $data; $this->_trace_data['__construct'] = $data; return $this->data; } /** * 魔术方法,当试图对对象进行打印如 echo 或print的时候,调用这个方法 * * 比如: * $a = new stdClass; * echo $a; * 等价于 echo $a->__toString(); * * @return $data */ public function __toString(){ if(is_int($this->data) || is_float($this->data)) $this->data = (string)$this->data; return $this->data; } /** * 魔术方法,当试图调用一个不存在的方法时,这个函数会接管这个请求 * * 比如 * $a= new stdClass; * $a->output(); * 等价于 * $a->__call("output"); * * @return object */ public function __call($name,$args){ $this->vaild_func($name); if(!$args){ $args = $this->data; $this->data = call_user_func($name,$args); }else{ $this->data =call_user_func_array($name,$args); } $this->_trace_data[$name] = $this->data; return $this; } /** * 检查方法是否是有效的 * @params string $name * @return void */ private function vaild_func($name){ /* if(!in_array($name,$this->_methods)){ throw new Exception("invaild method"); } */ } /** * 对数据进行追溯 * 比如 * $a = new String(" Hello World"); * $a->trim()->strlen(); * 在调用trim的时候,实际上把前后的空格给去掉了,所以数据是 * Hello World * 在调用strlen的时候 * 得到了一个字符串长度的值 * 追溯数据方便检查在哪个环节数据出现了问题 * * @return string */ public function trace(){ echo "<pre>"; var_dump($this->_trace_data); echo "</pre>"; } } class String extends Base_OOP_VAR{ //添加可用的方法 protected $_methods = array( ); } $a = new String(" A1587847415 "); echo $a->trim()->gettype()->strlen(); echo $a->trim("Dererer","A");?>
0 0
- PHP中实现类似JS的链式调用(修改版)
- js的链式调用-如何实现类似jquery的链式调用
- js的链式调用
- js的链式调用
- 如何在PHP中实现链式方法调用
- 如何在PHP中实现链式方法调用
- js链式调用的原理
- js实现类似php中strtotime函数和timetostr的日期转换/互换功能
- js实现链式调用及回调
- 方法链式调用的实现
- 【PHP】链式操作的实现
- JS中类似PHP中的strrpos\substr的函数--可用
- Node.js中,q在链式调用和异步调用中起到的作用
- 在javascript中实现类似PHP的var_dump 的方法
- Js实现类似PHP中的in_array方法
- php链式调用
- php链式调用
- php 理解链式调用
- 全虚拟化HVM和半虚拟化PV虚拟平台通信机制分析
- TCP协议三次握手过程分析
- XenServer中VM的存储格式对空间以及性能的影响
- 公有云不安全而私有云安全是云计算安全的两大谎言
- notepad++的使用技巧
- PHP中实现类似JS的链式调用(修改版)
- 【Redis】 redis setnx命令实现分布式锁
- SqlServer服务的启动
- linkLabel控件的用法1
- Java加密与解密的艺术(第2版)
- Java 判断多级路径是否存在,不存在就创建
- 【GO语言】文件操作例子
- GENERATE DATE / TIME DIMENSION IN INFORMATICA
- 设置sublime不自动打开最近文件