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

时间:2011-08-30 18:56:58

标签: php namespaces chaining method-chaining

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

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

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

这个:

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

抛出错误:

Parse error: syntax error, unexpected T_NS_SEPARATOR

有什么方法吗?

我几乎已经假设这是不行的。但要确保我不会错过任何东西。

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

2 个答案:

答案 0 :(得分: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的返回是名称空间User中的Core类,方法User_Friends()是其中的一部分。

修改 我建议您再看一下docs以及“Basics”文章。

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

答案 1 :(得分:0)

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

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