我们在几个核心系统中使用方法链接。我们试图将一些系统命名为远离我们的模块。但是,我无法通过链接来获取任何类型的命名空间解析。
所以虽然这有效(像往常一样):
$GLOBALS['model']->User()->User_Friends()->getAll();
另一方面,这个:
$GLOBALS['model']->Core\User()->User_Friends()->getAll();
抛出错误:
Parse error: syntax error, unexpected T_NS_SEPARATOR
有什么方法吗?
我几乎已经假设这是不行的。但要确保我不会错过任何东西。
根据您的观点(绝对是我的观点),这是一个错误。
答案 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()
替换_
中\