对象方法链中的命名空间解析


PHP: Namespace resolution in object method chains

我们在几个核心系统中使用方法链。我们正试图将其中一些系统的命名空间从我们的模块中剥离出来。然而,我有麻烦获得任何类型的命名空间解析与链接工作。

所以当这正常工作时:

$GLOBALS['model']->User()->User_Friends()->getAll();
另一方面,

this

$GLOBALS['model']->Core'User()->User_Friends()->getAll();

抛出错误:

Parse error: syntax error, unexpected T_NS_SEPARATOR

有别的办法吗?

我几乎已经假设这是不允许的。但要确保我没有错过什么

根据你的观点(当然是我的观点),这是一个bug

命名空间的解析可以在方法User发生,而不是作为方法本身的属性

在代码:

class model {
  private $user = false;
  public function User () {
    if ($this->user == false)
       $this->user = new Core'User(); // <--- namespace use happens here
    return $this->user;
  }
}

因此,方法User的返回值是命名空间CoreUser类,方法User_Friends()是其中的一部分。

编辑我建议你再看一下文档和"基础"这篇文章。

编辑2 使用__NAMESPACE__从重载方法中确定要操作的名称空间:

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

这没有任何意义。GLOBALS['model']是一个对象(我假设,因为您使用->访问它的成员),并且对象成员不能(也不需要)被命名空间(因为它们属于特定的类/对象)。

由于您使用_call()来神奇地调用不存在的方法,您需要假设一个导航约定,例如$GLOBALS['model']->Core_User()->User_Friends()->getAll();,然后在__call()中将_替换为'