另一个呼叫方法

时间:2011-11-28 22:15:42

标签: php

我有很多方法需要测试是否已经到达远程服务器,如果没有,请到达它。

我的第一个想法是__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,或者有更好的方法吗?

3 个答案:

答案 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)

在我看来,你觉得这太复杂了。 (假设我理解你的问题。)

为什么不能让与远程服务器通信的功能在完成后设置标志?

为什么需要检查连接的每个阶段?为什么他们分开舞台呢?他们不是按照特定的顺序一起工作,而不是从任何其他代码?没有任何理由使它们成为单独的功能。 (除非您的代码中有更多我不知道的内容。)