写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。

所以很多人写程序都会选择三元运算取代if..else...。

而用过JS的人应该都见识过js中的链式方法。

如 somevars.func().func2().func3()...funcN();

这样的写法使得代码更简练,并且作用关系一目了然。

那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是。

所以解决方法就是让php的变量变成一个对象。

代码如下:


  1. <?php 
  2. error_reporting(E_ALL | E_STRICT); 
  3. /** 
  4.  * PHP-OOP_VAR 让php的变量变成一个对象 
  5.  * 
  6.  * 
  7.  * @version 0.0.1 
  8.  * @author momodev 
  9.  * @website http://momodev.blog.51cto.com 
  10.  * @license GPL v3 - http://vork.us/go/mvz5 
  11.  */ 
  12. Abstract Class Base_OOP_VAR{ 
  13.  
  14.     /** 
  15.      * 追溯数据,用来进行调试 
  16.      * @var array 
  17.      */ 
  18.     private $_trace_data = array(); 
  19.  
  20.     /** 
  21.      * 保存可用的方法列表 
  22.      * @var array 
  23.      */ 
  24.     protected $_methods = array
  25.     ); 
  26.  
  27.     /** 
  28.      * 数据本身 
  29.      * @var null 
  30.      */ 
  31.     protected $data
  32.  
  33.     /** 
  34.      * 初始化变量 
  35.      * @param var 
  36.      * @return void 
  37.      */ 
  38.     public function __construct($data){ 
  39.         $this->data = $data
  40.         $this->_trace_data['__construct'] = $data
  41.         return $this->data; 
  42.     } 
  43.  
  44.     /** 
  45.      * 魔术方法,当试图对对象进行打印如 echo 或print的时候,调用这个方法 
  46.      *  
  47.      * 比如: 
  48.      * $a = new stdClass; 
  49.      * echo $a; 
  50.      * 等价于 echo $a->__toString(); 
  51.      *  
  52.      * @return $data 
  53.      */ 
  54.     public function __toString(){ 
  55.         if(is_int($this->data) || is_float($this->data)) 
  56.             $this->data = (string)$this->data; 
  57.         return $this->data; 
  58.     } 
  59.  
  60.     /** 
  61.      * 魔术方法,当试图调用一个不存在的方法时,这个函数会接管这个请求 
  62.      *  
  63.      * 比如 
  64.      * $a= new stdClass; 
  65.      * $a->output(); 
  66.      * 等价于 
  67.      * $a->__call("output"); 
  68.      *  
  69.      * @return object 
  70.      */ 
  71.     public function __call($name,$args){ 
  72.         $this->vaild_func($name); 
  73.         if(!$args$args = $this->data; 
  74.         $this->data =  call_user_func($name,$args); 
  75.         $this->_trace_data[$name] = $this->data; 
  76.         return $this
  77.     } 
  78.  
  79.     /** 
  80.      * 检查方法是否是有效的 
  81.      * @params string $name 
  82.      * @return void 
  83.      */ 
  84.     private function vaild_func($name){ 
  85.         if(!in_array($name,$this->_methods)){ 
  86.             throw new Exception("invaild method"); 
  87.         } 
  88.     } 
  89.  
  90.     /** 
  91.      * 对数据进行追溯 
  92.      * 比如 
  93.      * $a = new String(" Hello World"); 
  94.      * $a->trim()->strlen(); 
  95.      * 在调用trim的时候,实际上把前后的空格给去掉了,所以数据是 
  96.      * Hello World 
  97.      * 在调用strlen的时候 
  98.      * 得到了一个字符串长度的值 
  99.      * 追溯数据方便检查在哪个环节数据出现了问题 
  100.      *  
  101.      * @return string 
  102.      */ 
  103.     public function trace(){ 
  104.         echo "<pre>"
  105.         var_dump($this->_trace_data); 
  106.         echo "</pre>"
  107.     } 
  108.  
  109.  
  110. /** 
  111.  * ex. 怎么来使用这个抽象类 
  112.  * 
  113.  * 声明一个字符串对象 
  114.  * class String extends Base_OOP_VAR{ 
  115.  *  //添加可用的方法 
  116.  *  protected $_methods = array( 
  117.  *      'trim', 
  118.  *      'strlen', 
  119.  *      'gettype' 
  120.  *  ); 
  121.  * 
  122.  * } 
  123.  * //使用这个对象 
  124.  * $a = new String(" Hello world"); 
  125.  * echo $a->trim()->strlen()->gettype(); 
  126.  * $a->trace(); 
  127.  * //调试的数据类似这样 
  128.  * array(4) {  
  129.  *      //初始化时的数据 
  130.  *      ["__construct"]=> string(12) " Hello world" 
  131.  *      //去除前后空格的数据  
  132.  *      ["trim"]=> string(11) "Hello world" 
  133.  *      //代表字符串长度的数据  
  134.  *      ["strlen"]=> int(11)  
  135.  *      //代表字符串类型的数据 
  136.  *      ["gettype"]=> string(7) "integer" 
  137.  *  } 
  138.  *  
  139.  *  
  140.  * 
  141.  * 
  142.  **/ 

同时我已经把这个文件放在了github上,欢迎童鞋们fork

https://github.com/momodev/PHP-OOP_VAR