PHP命名空间资格 - 为什么我必须完全符合资格?

时间:2016-09-22 20:09:47

标签: php namespaces

我正在从c#转换为php而我在某些地方转换时遇到问题。特别是命名空间。我遇到的问题是,当从另一个命名空间调用一个类时,我必须完全限定每个命名空间。这是正常的吗?

<?php
    namespace Lib\Things;

    class TheThings
    {

    }

然后在另一个班级

<?php
    namespace App;

    use Lib\Things;

    class DoStuff
    {
        public function doStuff()
        {
            $things = new TheThings();
        }
    }

这不起作用......我最终不得不这样做

new Lib\Things\TheThings();

或者

<?php
    namespace App;

    use Lib\Things as T;

    class DoStuff
    {
        public function doStuff()
        {
            $things = new T\TheThings();
        }
    }

我在composer.json文件中也有这个

"psr-4": {
        "App\\": "app/",
        "Lib\\": "lib/"
    }

这是正常的还是我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

PHP manual use关键字称为导入或别名。 这意味着

use Lib\Things;

use Lib\Things as Things;

是一样的。这导致您不必使用完全限定名称来实例化命名空间中的类,您只能使用导入的命名空间的别名。因此,在您的情况下,以下内容将起作用:

<?php
    namespace App;

    use Lib\Things;
    // same as:
    // use Lib\Things as Things; // explicit alias

    class DoStuff
    {
        public function doStuff()
        {
            $things = new Things\TheThings();
        }
    }

(请注意,这与您的第二个示例相同,唯一的区别是此处的别名未明确设置为T(默认为Things)。

为了能够使用没有任何名称空间前缀的类名,您必须设置实际类的别名:

<?php
    namespace App;

    use Lib\Things\TheThings;
    // same as:
    // use Lib\Things\TheThings as TheThings; // explicit alias

    class DoStuff
    {
        public function doStuff()
        {
            $things = new TheThings();
        }
    }

总之,如果您开始考虑将use运算符设置为命名空间或类(或其他)的别名,那么您将了解它。

PS 1:

在PHP 7之前,如果要从同一名称空间导入多个类,则必须编写:

use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
  

从PHP 7.0开始,从同一名称空间导入的类,函数和常量可以在一个use语句中组合在一起:

use some\namespace\{ClassA, ClassB, ClassC as C};

PS 2:

composer帮助自动包括/加载实际的php文件,基于一些PSR *规则,它在名称空间如何在裸PHP中工作方面没有任何作用。

答案 1 :(得分:0)

当你这样做时:

$things = new TheThings();

在当前命名空间(在您的示例中为App)中搜索类,这就是为什么不起作用。

因此,您需要指定完整的类命名空间,因此解释器知道您引用的是哪个类,您还可以拥有namepsace2/TheThingsthis/is/another/namespace/TheThings类。

只需包含完整的类名称空间

use Lib\Things\TheThings;