我正在尝试在我的项目中实现 PSR-4 自动加载。这是我继承的一个现有应用程序,目前不使用 OOP(它都是脚本化的),但我希望随着时间的推移进行重构以使用 OOP,而 PSR-4 对我来说至关重要,因为它最终将成为一个大型项目.
目前我们不依赖任何外部库(完全内部编写的旧应用程序),因此此时 composer 仅用于自动加载,但最终将使用第三方包,例如 phpunit。
我的服务器上的应用程序结构如下所示:
/var/www/appurl/
│ composer.json
│
├───htdocs
│ ├───AppName
│ │ ├───admin
│ │ │ authenticated.php
│ │ │ init.php
│ │ │ login.php
│ │ │
│ │ └───php
│ │ └───search.php
│ └───Framework
│ ├───Helpers
│ │ └───OSHelpers.php
└───vendor
│ autoload.php
│
└───composer
autoload_classmap.php
autoload_namespaces.php
autoload_psr4.php
autoload_real.php
ClassLoader.php
作曲家.json:
{
"autoload": {
"psr-4": {
"Framework\\": "htdocs/Framework"
}
}
}
当用户成功登录时 login.php 调用 authenticated.php ,并且 authenticated 调用我的 init.php 脚本,其中包含:
<?php
require_once('../../../vendor/autoload.php');
?>
是 search.php 有错误。用户通过身份验证后会被重定向到 search.php。
search.php 有以下几行:
use Framework\Helpers\OSHelpers;
$current_os = OSHelpers::GetConciseOSFromUserAgent($user_agent);
OSHelpers.php 命名空间为:namespace Framework\Helpers;
如果使用require_once ,则对 OSHelpers 的静态调用可以正常工作,但是我定义 $current_os 的第二行似乎失败了。
我收到的错误是:
Fatal error: Class 'Framework\Helpers\OSHelpers' not found in /var/www/appurl/htdocs/AppName/php/search.php on line 829
我对它为什么这样做有点茫然?当我按照此视频 ( https://www.youtube.com/watch?v=VGSerlMoIrY ) 中的示例进行操作时,我的示例应用程序运行良好,但尝试以稍微复杂的结构复制它会给我带来问题。
我已经完成了 composer dump-autoload -o,在供应商目录中查看显示我的类定义正确。从供应商/作曲家/autoload_classmap.php:
'Framework\\Helpers\\OSHelpers' => $baseDir . '/htdocs/Framework/Helpers/OSHelpers.php',