我有很多方法需要测试是否已经到达远程服务器,如果没有,请到达它。
我的第一个想法是__call魔术方法,但该方法仅在真实方法(原始名称)未显示时被称为。
<?php
public function __call( $name, $arguments ) {
$needsExecution = array(
'getBody', 'getHeader', 'getHeaders', 'getRawOutput',
'getStatusCode', 'getFullHttp'
);
if ( in_array( $name, $needsExecution ) ) {
if ( !$this->hasBeenExecuted() ) {
$this->execute();
}
}
}
public function getBody() {
return $this->responseBody;
}
public function getHeaders() {
return $this->responseHeaders;
}
?>
我真的需要在每种方法中都有一堆if,或者有更好的方法吗?
答案 0 :(得分:2)
如何更改代码:
<?php
public function __call( $name, $arguments ) {
$needsExecution = array(
'getBody', 'getHeader', 'getHeaders', 'getRawOutput',
'getStatusCode', 'getFullHttp'
);
if ( in_array( $name, $needsExecution ) ) {
if ( !$this->hasBeenExecuted() ) {
$this->execute();
}
return $this->{'_' . $name}();
//return call_user_func(array($this, '_' . $name));
}
}
protected function _getBody() {
return $this->responseBody;
}
protected function _getHeaders() {
return $this->responseHeaders;
}
?>
答案 1 :(得分:1)
我不确定你在做什么...但是如果你想拦截每个方法调用。
class ObjectProxy {
protected $obj;
function __construct($obj) {
$this->obj = $obj;
}
function __call($methodName, $arguments) {
//do stuff
return call_user_func_array($methodName, $this->obj, $arguments);
}
}
$proxied = new ObjectProxy(new OrigionalType());
$proxied->getBody();
您可能希望实现更多魔术方法,使其适用于多个实例方法调用,但您明白了。它并非适用于所有情况的解决方案,但有时也很方便。
答案 2 :(得分:0)
在我看来,你觉得这太复杂了。 (假设我理解你的问题。)
为什么不能让与远程服务器通信的功能在完成后设置标志?
为什么需要检查连接的每个阶段?为什么他们分开舞台呢?他们不是按照特定的顺序一起工作,而不是从任何其他代码?没有任何理由使它们成为单独的功能。 (除非您的代码中有更多我不知道的内容。)