Php 将名称空间与从变量创建的类一起使用

Php 将名称空间与从变量创建的类一起使用,php,namespaces,Php,Namespaces,所以我创建了这两个类 //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.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);
    }    

工作起来不会有问题。这是为什么?这里是否有我需要避免的潜在陷阱?

因为字符串可以从一个名称空间传递到另一个名称空间。这使得名称解析充其量是模棱两可的,并且很容易引入奇怪的问题

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';

谢谢你的回答(德克塞:)