所以我创建了这两个类
//Quarter.php namespace Resources; class Quarter { ... } //Epoch.php namespace Resources; class Epoch { public static function initFromType($value, $type) { $class = "Quarter"; return new $class($value, $type); } }
现在这是两者的简化版本,但足以说明我的问题。此处显示的类将无法使用,因为找不到四分之一类。为了使其工作,我可以将$ class变量更改为
$class = "\Resources\Quarter";
所以我的问题是:当两个类已经是同一个命名空间的成员时,为什么需要在这里使用命名空间。仅当我将类名放入变量中时,才需要名称空间:
public static function initFromType($value, $type) { return new Quarter($value, $type); }
可以正常工作。为什么会这样?在这里有什么需要避免的潜在陷阱吗?
因为可以将字符串从一个名称空间传递到另一个名称空间。这就使名称解析充其量是模棱两可的,并且容易引入奇怪的问题。
namespace Foo; $class = 'Baz'; namespace Bar; new $class; // what class will be instantiated?
某个名称空间中的文字不存在此问题:
namespace Foo; new Baz; // can't be moved, it's unequivocally \Foo\Baz
因此,所有“字符串类名”始终都是绝对的,需要写为FQN:
$class = 'Foo\Baz';
(注意:无领导\。)
\
您可以将其用作速记,相当于类中的自引用self:
self
$class = __NAMESPACE__ . '\Baz';