写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。
所以很多人写程序都会选择三元运算取代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