链式编程使用起来非常惬意,本文尝试在PHP下实现一种链式编程的应用
我们知道在new class后调用method,在常规PHP编程下每次调用都要
$instance->method1();
$instance->method1();
这样无尽的写N多,如果中间有错误判断那就成这样了
if($instance->method1())
if($instance->method2())
$instance->method3();
//or
$instance->method1();
if($instance->hasError()) die('error');
$instance->method2();
if(....) ...;
看上去很烦,写起来更烦,特别是在开发期,那简直是噩梦。
如果能保证这样执行
if($instance->m0()->m1()->m2()->hasError()) die('error');
那就安逸了,实现这个,方法其实很简单就是在这种可以链式进行的方法中包含错误判断,无论如何都返回this, 当然类似hasError这样的方法是不返回this的,这一类方法总是出现在最后,但是在开发期,我们在方法里面复制粘贴N多的
if($this->hasError())
return $this
//someting..
return $this;
这样也够烦人的,当然如果定型了,那嵌入这些代码也无所谓。开发期就烦死人了。
可以利用PHP的魔术方法来实现这个,这里给出一个基本的结构
class CChain{
private $instance=null;
private $haserror=false;
public function __construct($instance) {
if(!method_exists($instance,'getError'))
die('Instance does not have a method getError().');
$this->instance=$instance;
}
public function __call($m,$a) {
if($this->haserror)
return $m=='getError'?$this->haserror:$this;
$this->haserror=&$this->instance->getError()?:false;
if($this->haserror)
return $m=='getError'?$this->haserror:$this;
$ret=&call_user_func_array(array(&$this->instance, $m),$a);
$this->haserror=&$this->instance->getError()?:false;
if($this->haserror)
return $m=='getError'?$this->haserror:$this;
if($m=='getError') return $this->haserror;
if($ret===null)
return $this;
return $ret;
}
public function __get($n) {
return $this->instance->$n;
}
public function __set($n,$v) {
$this->instance->$n=$v;
}
}
class test {
public $error=false;
public function getError() {
return $this->error;
}
public function setError($v) {
$this->error=$v;
}
public function m0() {
/* someting without return*/
}
public function m1() {
/* someting without return*/
}
public function m2($foo=null) {
if($foo) {
return $this->setError('error '.__METHOD__);
}
/* someting without return*/
}
}
$test=new CChain(new test);
print_r( $test->m0()->m1()->m2(1) );
echo($test->error);
当然如果想更详细的跟踪错误发生在那个method也很容易,改造__call记录下$m就好了。
分享到:
相关推荐
链式编程,而不是小部件嵌套构造函数。 Container buildItem ( String name) { return Icon ( Icons .phone) . addNeighbor ( Text (name)) . intoRow (crossAxisAlignment : CrossAxisAlignment .center,) . ...
学习随机过程,能应用随机过程,markov chain
stepchain 通用业务流程流水线处理框架。 类似于Commons Chain和Commons Pipeline这样的Java Pipeline Step Chain用于组织复杂处理流程执行的流行技术。支持通用业务job、services子流程无限制拆分。支持业务子流程...
Supply Chain Guru is cutting edge software that allows you to perform both supply chain simulation and optimization. This enables you to directly solve problems involving supply chain strategic ...
Bayesian and Markov chain
Lincoln Chain
Supply Chain Council's Supply-Chain Operations Reference model (SCOR).
supply chain of the zara company
Chain_Interoperability
critical chain project management
commons-chain.jar commons-chain.jar
Zanneth-Chain-Disaster-8832785.zipIOS应用例子源码下载Zanneth-Chain-Disaster-8832785.zipIOS应用例子源码下载 1.适合学生学习研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Lean Supplier Chain Management 精益生产 Lean Supplier Chain Management 精益生产
VF brand global supply chain strategy
C++编写的chain类,经过老师检查 无误
## Chain 一个基于django2.0版本,极简主义的云主机CMDB增删改查项目! 非常适合django刚入门的人拿来参考! 大家可以看一下,欢迎提出修改意见。 然后大家以此为基础,各自开发自己的板块,最后合成一个项目。 ...
Markov Chain Algorithm(Chinese)
介绍Markov chain,random walk及其两者之间关系
Boosting Chain
IT Value Chain Roadmap