如何在PHP中实现链式方法调用

字体大小: 中小 标准 ->行高大小: 标准
写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。 
所以很多人写程序都会选择三元运算取代if..else...。

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

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

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

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

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

代码如下:


 

[php] view plaincopy 
01.<?php 
02.error_reporting(E_ALL | E_STRICT); 
03./** 
04.* PHP-OOP_VAR 让php的变量变成一个对象 
05.* 
06.* 
07.* @version 0.0.1 
08.* @author momodev 
09.* @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./** 
112.* ex. 怎么来使用这个抽象类 
113.* 
114.* 声明一个字符串对象 
115.* class String extends Base_OOP_VAR{ 
116.* //添加可用的方法 
117.* protected $ _methods = array( 
118.* 'trim', 
119.* 'strlen', 
120.* 'gettype' 
121.* ); 
122.* 
123.* } 
124.* //使用这个对象 
125.* $a = new String(" Hello world"); 
126.* echo $a->trim()->strlen()->gettype(); 
127.* $a->trace(); 
128.* //调试的数据类似这样 
129.* array(4) { 
130.* //初始化时的数据 
131.* ["__construct"]=> string(12) " Hello world" 
132.* //去除前后空格的数据 
133.* ["trim"]=> string(11) "Hello world" 
134.* //代表字符串长度的数据 
135.* ["strlen"]=> int(11) 
136.* //代表字符串类型的数据 
137.* ["gettype"]=> string(7) "integer" 
138.* } 
139.* 
140.* 
141.* 
142.* 
143.**/ 

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67548.html