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