我正在编写一个调用另一个类并返回它的函数,以便我可以像$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;
}
答案 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"))