如何加载命名空间的所有类?

Pha*_*e01 3 php namespaces

我讨厌PHP命名空间.它们不像普通的那样工作,或者至少像我期望的那样.无论如何,因为我正在尝试编写一个小型库,我必须处理它们,我想知道你是否可以设法像对待C#或Java一样对待它们,也许使用spl_autoload_*函数.就像是:

图书馆:

<?php
namespace A
{
    class MyAClass {...}
}

namespace A\B
{
    class MyBClass {...}
}
?>
Run Code Online (Sandbox Code Playgroud)

和应用程序:

<?php
include("library\autoloader.php");

use A; //Loads every class in A namespace
use A\B; //Loads every class in A\B namespace

$obj = new MyAclass();
$obj2 = new MyBCLass();
?>
Run Code Online (Sandbox Code Playgroud)

我试过简单地说:

<?php
function autoload($name)
{
    //echo "loading {$name}.php<br />";
    require_once($name.".php");
}
spl_autoload_register("autoload");
?>
Run Code Online (Sandbox Code Playgroud)

但我被迫这样做:

<?php
include("Library\autoload.php");

$obj = new MyNamespace\MyClass();
?>
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

<?php
include("Library\autoload.php");

use MyNamespace;    

$obj = new MyClass();
?>
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 7

  1. 不,您无法加载命名空间中的所有类.命名空间实际上只是对类/函数命名系统的补充,它与文件等没有内在联系.由于类通过包含其文件而"加载",并且由于名称空间未链接到文件,因此文件系统中任何数量的位置都可能包含任意数量的文件,这些文件包含命名空间的类.PHP无法自动定位它们.
  2. 可以通过循环glob结果简单地加载文件夹中的所有文件include.如果根据命名空间组织文件,那么"将"加载命名空间中的所有类."
  3. 你不应该真的这样做,而是使用自动加载器,在需要时根据需要包含文件.这需要你写一个正确的自动加载器,它不清楚你的问题是什么.为了有效地使用自动加载器,您应该为每个以类命名的类使用一个文件.您的自动加载器还需要构建正确的相对路径.
  4. use不加载类.use仅将命名空间名称别名为当前文件中的较短或替代名称.该类仅在第一次需要时加载; 例如,当你写new Fooextends Foo.

如果你想能够写出类似的东西use Foo\*,然后Foo用他们的名字引用其中的所有类:这在PHP中是不可能的.您可以做的最好是缩短命名空间前缀,例如use Foo\Bar as B,然后B\Baz在任何地方使用.