使用命名空间与从变量创建的类

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

这将没有问题。为什么会这样,有哪些我需要避免的潜在陷阱?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接