所以我创建了这两个类
//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);
}
}
现在这是两者的一个非常简化的版本,但足以说明我的问题。这里显示的类将无法工作,因为它找不到Quarter类。为了使它工作,我可以将$ class变量更改为
$class = "\Resources\Quarter";
所以我的问题是:当两个类都已经是同一命名空间的成员时,为什么我需要在这里使用命名空间。仅当我将类名放在变量中时才需要命名空间:
public static function initFromType($value, $type) {
return new Quarter($value, $type);
}
将毫无问题地工作。为什么会这样,我需要避免任何潜在的陷阱?
答案 0 :(得分:4)
因为字符串可以从一个名称空间传递到另一个名称空间。这使得名称解析模糊不清,很容易引入奇怪的问题。
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
:
$class = __NAMESPACE__ . '\Baz';