【发布时间】:2014-10-09 19:42:36
【问题描述】:
我看到了一些示例代码,例如
$log = new Monolog\Logger('name');
为什么不总是使用完全限定的类名呢?
$log = new \Monolog\Logger('name');
所以你不必担心这个文件是否在任何命名空间中使用,对吧?
【问题讨论】:
我看到了一些示例代码,例如
$log = new Monolog\Logger('name');
为什么不总是使用完全限定的类名呢?
$log = new \Monolog\Logger('name');
所以你不必担心这个文件是否在任何命名空间中使用,对吧?
【问题讨论】:
如果您从单独的命名空间引用一个类,您将使用完全限定的命名空间。例如:
<?php
namespace Foo\Bar;
class ClassName
{
function __construct()
{
$this->foobar = new Monolog\Logger;
}
}
在这种情况下,$this->foobar 将被解析为 Foo\Bar\Monolog\Logger 的实例。
如果 Monolog 是与 Foo\Bar 完全不同的包,我们不希望发生这种情况,因此我们使用完全限定的命名空间。
如果您使用 \Monolog\Logger 的完全限定命名空间,$this->foobar 将是 Monolog\Logger 的一个实例。
如果您在自己的命名空间中使用来自单独包/命名空间的类,请使用完全限定的命名空间。 如果您在同一命名空间中使用类,请仅使用限定的命名空间。
【讨论】:
use ... 和 ... extends ... 语句呢? Name resolution rules 页面中的示例不包括这两种情况。可以推断,但他们并不明确。