PHP如何从另一个名称空间导入所有类


74

我在现有项目中实现名称空间。我发现您可以使用关键字“ use”将类导入您的名称空间。我的问题是,我也可以将所有类从1个命名空间导入另一个。例:

namespace foo
{

    class bar
    {

        public static $a = 'foobar';

    }

}

namespace
{
    use \foo;  //This doesn't work!
    echo bar::$a;
}

PHP 7+更新

PHP 7中的一项新功能是分组声明。这并不像在给定命名空间中的所有类上使用1个“ use语句”那样容易,但是却使它变得更加容易...

示例代码:

<?php
// Pre PHP 7 code
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

// PHP 7+ code
use some\namespace\{ClassA, ClassB, ClassC as C};
?>

另请参阅:https : //secure.php.net/manual/en/migration70.new-features.php#migration70.new-features.group-use-declarations


1
请注意,“导入”并不意味着您实际上可以找到该类。您仍然需要通过手动需求或自动加载器使该类可用。
Nanne

1
当然可以,但我不知道如何用其他方式表达。
罗布

我是这么认为的,但是为了避免造成混乱:)
Nanne

当我阅读有关PHP7的更新时,我皱了皱眉。让我感到沮丧的是,PHP没有意识到在命名空间中打开所有类会多么方便。在Java中,您只有use foo/*
eggmatters 2016年

1
@Ultimater不错的补充。如果您可以启用评估支持,这可能是一个解决方案。就个人而言,我不会推荐它。
罗布

Answers:


73

这在PHP中是不可能的。

您所能做的就是:

namespace Foo;

use Bar;

$obj = new Bar\SomeClassFromBar();

5
或者,当然,您可以将具体的类放在使用子句中。(use Bar\SomeClassFromBar; $obj = new SomeClassFromBar();
的Ondrej Mirtes

3
来自C#世界,这听起来并不令人满意。:-(
dotNET

1
@dotNET我爱PHP,直到被介绍给真正的OOP为止。我仍在使用PHP,但这是我可能会转换为C#的原因之一
boi_echos 18-10-14

撇开:您应该真正在名称空间前加反斜杠。否则,您是说它是相对于Foo名称空间的。很多时候,这种假定的疏忽在屁股上咬人。只要养成显式指定根名称空间的习惯(如果它是根名称空间而不是相对于当前名称空间的话)(即使当前名称空间可能恰好是根)
ahnbizcad

3

您可以使用“ as”来缩短和命名长名称空间

composer.json

{
    "autoload": {
        "psr-4": {
            "Lorem\\Ipsum\\": "lorem/ipsum",
            "Lorem\\Ipsum\\Dolor\\": "lorem/ipsum/dolor",
            "Lorem\\Ipsum\\Dolor\\Sit\\": "lorem/ipsum/dolor/sit"
        }
    }
}  

index.php

    <?php

    use Lorem\Ipsum\Dolor\Sit as FOO;

    define ('BASE_PATH',dirname(__FILE__));
    require BASE_PATH.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';

    $bar = new FOO\Bar();
    $baz = new FOO\Baz();
    $qux = new FOO\Qux();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.