我们在几个核心系统中使用方法链。我们正试图将其中一些系统的命名空间从我们的模块中剥离出来。然而,我有麻烦获得任何类型的命名空间解析与链接工作。
所以当这正常工作时:
$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
的返回值是命名空间Core
的User
类,方法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()
中将_
替换为'