-1

我们在几个核心系统中使用方法链。我们正在尝试将其中一些系统命名为远离我们的模块。但是,我无法通过链接工作来获得任何类型的命名空间解析。

所以虽然这有效(像往常一样):

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

另一方面,这:

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

抛出错误:

Parse error: syntax error, unexpected T_NS_SEPARATOR

有没有办法解决?

我几乎已经假设这是不行的。但要求确保我没有遗漏任何东西。

根据您的观点(绝对是我的),这是一个错误。

4

2 回答 2

1

命名空间的解析可以发生方法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中的类,方法是其中的一部分。UserCoreUser_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];
    }
}
于 2011-08-30T19:05:44.537 回答
0

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

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

于 2011-08-30T19:08:45.740 回答