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

标签 php namespaces

我讨厌 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();
?>

最佳答案

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

如果您希望能够编写类似于 use Foo\* 的内容,然后通过它们的裸名引用 Foo 中的所有类:这在 PHP 中是不可能的。你能做的最好的事情就是缩短 namespace 前缀,例如使用 Foo\Bar 作为 B,然后在所有地方使用 B\Baz

关于php - 如何加载命名空间的所有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29851099/

相关文章:

java - 使用 REST 或 Web 服务上传/下载文件

在 XmlParse/序列化后丢失的属性值中使用的 groovy xml 命名空间定义

typescript - 如何让接口(interface)包含子类型,同时本身也是有效类型

C++ 强制命名空间合规性

C Typedef 和结构问题

第 20 行的 PHP 警告 : Division by zero in */public_html/wp-content/themes/news/functions. php

php - 如何从 WooCommerce 中的订单项目获取产品类别 ID

php - 插入时 Doctrine 自动截断值

php - 日期验证之前的 laravel 不起作用

javascript - 如何通过函数传递对对象的引用?