2011-11-28 97 views
3

我有很多方法需要测试远程服务器是否已经到达,如果没有,达到它。在另一个之前调用方法

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

回答

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; 
} 

?> 
+0

是的,它是合法的:'$ this - > {'_'。$ funtionName}()' – webbiedave

+0

谢谢,重新加入。 – sberry

0

在我看来像你这个过于复杂。 (假设我理解你的问题。)

为什么不在远程服务器上设置一个标志的功能呢?

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

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(); 

您可能想要实现更多的魔术方法,以使其适用于多个实例方法调用,但您明白了。这不是所有情况下的解决方案,但有时可能非常方便。

相关问题