只需将文件放入 PSR-4 目录即可加载 PHP 类

Loading PHP classes by just putting files into PSR-4 directory

在我当前的库中,我有 classes 和 class 定义之外的静态代码,我想在浏览具有自动加载功能的 index.php 文件时执行(使用正确地将 class 文件放入 PSR-4 文件夹结构中,并在之前调用 composer install)。

这笔交易还不错。例如,在我的自定义 Error.php class 中,我可以在 class 之外调用 set_error_handler 函数,这样警告就可以捕捉到。并将此文件放入 PSR-4 自动加载中可以减轻不必在 index.php 中调用任何 Error.php 代码来启用此捕获的痛苦。每个只使用我的命名空间并自动加载我的库的源都认为这是理所当然的。

我试图将 use \MyNamespace\Error; 包含在 index.php 文件中,但是 Error.php 中的代码,在错误 class 定义之外,不会自动执行。

class 之外的代码仅在我调用 index.php 文件(具有自动加载的文件)中的 class 方法时执行.

这可以做到吗?感谢您的宝贵时间。

use \MyNamespace\Error; 不会触发自动加载,它只是允许您在代码中使用更短的 class 名称 - new Error() 而不是 new \MyNamespace\Error()。如果你想包含 Error.php 文件,你需要使用这个 class。可能最安全的方法是使用 class_exist():

class_exists(Error::class);

但老实说,您应该重新考虑您的设计,在带有 class 声明的文件中隐式注册错误处理程序是违反 PSR-1 的,并且在大项目中可能真的很烦人。

Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both

https://www.php-fig.org/psr/psr-1/#23-side-effects

如果您创建单独的方法来注册错误处理程序并在 index.php:

中显式调用它,那就没那么神奇了
Error::registerErrorHandler();