PHP中实现类似JS的链式调用(修改版)

来源:互联网 发布:网络创世纪uo主题曲 编辑:程序博客网 时间:2024/05/21 09:58
写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。
所以很多人写程序都会选择三元运算取代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