4

所以我创建了这两个类

//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);
    }    

将毫无问题地工作。为什么会这样?这里有什么我需要避免的潜在陷阱吗?

4

1 回答 1

5

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

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';
于 2013-05-29T07:55:40.967 回答