PHP:对象方法链中的名称空间解析
我们在几个核心系统中使用方法链接。我们正试图将其中一些系统的名称空间从我们的模块中分离出来。然而,我很难通过链接获得任何类型的名称空间解析 因此,尽管这起作用(与往常一样): 另一方面,这:PHP:对象方法链中的名称空间解析,php,namespaces,chaining,method-chaining,Php,Namespaces,Chaining,Method Chaining,我们在几个核心系统中使用方法链接。我们正试图将其中一些系统的名称空间从我们的模块中分离出来。然而,我很难通过链接获得任何类型的名称空间解析 因此,尽管这起作用(与往常一样): 另一方面,这: $GLOBALS['model']->Core\User()->User_Friends()->getAll(); 抛出错误: Parse error: syntax error, unexpected T_NS_SEPARATOR 这有什么办法吗 我几乎已经认为这是不可能的。但是要确
$GLOBALS['model']->Core\User()->User_Friends()->getAll();
抛出错误:
Parse error: syntax error, unexpected T_NS_SEPARATOR
这有什么办法吗
我几乎已经认为这是不可能的。但是要确保我没有遗漏什么
根据您的观点(当然是我的观点),它是一个bug。名称空间的解析可以发生在方法
用户
中,而不是作为方法本身的属性
代码:
class model {
private $user = false;
public function User () {
if ($this->user == false)
$this->user = new Core\User(); // <--- namespace use happens here
return $this->user;
}
}
这没有任何意义
GLOBALS['model']
是一个对象(我假设,因为您使用->
访问其成员),并且对象成员不能(也不需要)使用名称空间(因为它们属于特定的类/对象)
由于您正在使用\u call()
神奇地调用不存在的方法,因此需要假设一种导航约定,例如$GLOBALS['model']->Core\u User()->User\u Friends()->getAll()然后在你的\u调用()
中用\
您可以为类或函数命名名称空间,但不能为方法命名。似乎您也在努力为所有内容命名。为什么需要像这样对属性/方法进行分组?这不能发生,因为方法用户不存在。一个_call()方法将其作为回退和路由进行处理。然后,上面使用的命名空间代码将用于重载\u_call
方法。底线-不需要为类的方法命名名称空间。类可能具有多态性,以动态方式利用名称空间,但方法本身不知道名称空间。我上面使用的代码是为了演示这个概念,而不是字面上的解决方案。然后你需要使用命名约定,比如->Core\u User()
,并用\`in
\u call()`@Chris Yes,我理解。不幸的是,重载方法无法对名称空间做出假设。@Mchl这是唯一可行的想法之一。不幸的是,我们在方法名中使用下划线,因此它不是一个可行的分隔符。
class model {
private $user = false;
public function User () {
if ($this->user == false)
$this->user = new Core\User(); // <--- namespace use happens here
return $this->user;
}
}
class model {
private $objects = array();
public function __call($name, $arguments=false) {
$ns = __NAMESPACE__;
if (strlen($ns) < 1)
$ns = 'none';
if (!isset($this->objects[$ns]))
$this->objects[$ns] = array();
if (!isset($this->objects[$ns][$name])) {
$class_desc = (strlen($ns) > 0 ? __NAMESPACE__ . '\\' : ''). $name;
$this->objects[$ns][$name] = new $class_desc($arguments);
}
return $this->objects[$ns][$name];
}
}