我讨厌 PHP 命名空间。它们不像正常的那样工作,或者至少不像我期望的那样工作。无论如何,因为我正在尝试编写一个小型库,所以我必须处理它们,我想知道您是否可以像处理 C# 或 Java 那样处理它们,也许使用 spl_autoload_*
职能。像这样的东西:
图书馆:
<?php
namespace A
{
class MyAClass {...}
}
namespace A\B
{
class MyBClass {...}
}
?>
和应用:
<?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();
?>
我简单地试了一下:
<?php
function autoload($name)
{
//echo "loading {$name}.php<br />";
require_once($name.".php");
}
spl_autoload_register("autoload");
?>
但我不得不这样做:
<?php
include("Library\autoload.php");
$obj = new MyNamespace\MyClass();
?>
我确实想做这样的事情:
<?php
include("Library\autoload.php");
use MyNamespace;
$obj = new MyClass();
?>
最佳答案
- 不可以,您不能加载 namespace 中的所有类。命名空间实际上只是对类/函数命名系统的补充,它与文件等没有内在联系。由于类是通过包含它们的文件来“加载”的,并且由于 namespace 未链接到文件,因此文件系统中的任意数量的位置可能有任意数量的文件,其中包含 namespace 的类。 PHP 无法自动定位这些内容。
- 您可以通过遍历
glob
结果和include
简单地加载文件夹中的所有文件。如果您根据命名空间组织文件,那将“加载命名空间中的所有类。” - 您不应该真的这样做,而应该使用自动加载器,它会在需要时根据需要包含文件。这需要你编写一个正确的自动加载器,目前还不清楚你的问题是什么。为了有效地使用自动加载器,您应该为每个类使用一个以该类命名的文件。您的自动加载器还需要构建正确的相对路径。
use
不加载类。use
仅将命名空间名称别名为当前文件中的较短名称或替代名称。该类仅在第一次需要时加载;例如当您编写new Foo
或extends Foo
时。
如果您希望能够编写类似于 use Foo\*
的内容,然后通过它们的裸名引用 Foo
中的所有类:这在 PHP 中是不可能的。你能做的最好的事情就是缩短 namespace 前缀,例如使用 Foo\Bar 作为 B
,然后在所有地方使用 B\Baz
。
关于php - 如何加载命名空间的所有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29851099/