如何检查连接方法是否不存在php

时间:2013-06-21 14:02:21

标签: php

我正在编写一个调用另一个类并返回它的函数,以便我可以像$this->myUser()->getUsername()那样执行我的方法......现在我的问题是:

我有办法拦截->getUsername()内的myUser()或拦截无法找到的内容吗?...

这是因为我想使用另一个myUserExtended()的类,我想知道我是否可以在myUser()内将它们一起路由。因此如果->getCity()不在myUser()中,则会自动继续使用另一个包含myUserExtended()的变量。

可能不可能,但值得一提。

private function myUser( $setMyUser = false ) {

        if( $setMyUser ) {
            $this->_myUser = $setMyUser;
        }

        if( empty( $this->$_myUser ) ) {
            $this->_myUser = UserQuery::create()->findPK( $this->variables('userID') );
        }

        return $this->_myUser;
    }

3 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

public function __call($name, $args)
{
    if (function_exists($this->_myUser->$name())) {
        return $this->_myUser->$name();
    }
    return $this->_myUserExtended->$name();
}

如果你使用任何参数,你显然必须调整它。

答案 1 :(得分:0)

$this->myUser()->getUsername()相当于$user = $this->myUser(); $user->getUsername()。如果您可以将方法添加到$user变量包含的任何类中,则可以使用__call()魔术方法并检查->getCity()是否存在。或者您可以添加一个名为getCity()的方法,该方法可以调用myUserExtended()

答案 2 :(得分:0)

也许这样的事情会有所帮助:

class MyUserClass {
  private $_myUser;
  public function myUser( $setMyUser = false ) {

        if( $setMyUser ) {
            $this->_myUser = $setMyUser;
        }

        if( empty( $this->$_myUser ) ) {
            $this->_myUser = UserQuery::create()->findPK( $this->variables('userID') );
        }

        return $this; //if you want to use method chaining, you have to return $this
    }
  public function __call($name, $arguments) {
    $ext = new myUserExtended();
    $ext->$name($arguments);
    return $ext;
  }
}

$myUser = new MyUserClass();

$myUser->myUser()->getCity("New York"); //this will call $ext->getCity(array("New York"))