如何检查串联方法是否存在 PHP


how to check if a concatenated method doesnt exist php

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

有没有办法让我从myUser()内部拦截->getUsername()或拦截无法找到的?...

这是因为我想使用另一个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;
    }

这样的事情可能会解决问题:

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

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

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

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"))

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