【问题标题】:Class not found, composer and Zend Framework 1 autoloader issue找不到类,composer 和 Zend Framework 1 自动加载器问题
【发布时间】:2017-07-04 14:11:40
【问题描述】:

我在[root]/composer.json 文件中有以下类自动加载定义:

{
  ...
  "autoload": {
    "psr-0": {
      "": [
        "application/models",
        "application/controllers",
        "application/forms",
        "library/"
      ]
    },
    "psr-4": {
      "": ["src/"]
    },
    "classmap": [
      "app/AppKernel.php",
      "app/AppCache.php"
    ]
  },
  ...
}

当我调用[root]/public_html/index.php 页面时,出现以下错误:

PHP 致命错误:未捕获的错误:在 /var/www/html/application/bootstrap.php:29 中找不到类“classes\DependencyInjection”

[root]/public_html/index.php 中的代码如下:

$bootstrap = true;
require_once '../application/bootstrap.php';

[root]/application/bootstrap.php 文件中的内容是:

// turn on autoloading for classes
// composer autoloader
include(MMIPATH.'/vendor/autoload.php');

// zend autoload
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

$diContainer = new classes\DependencyInjection(services.yaml');
$proxy       = $diContainer->get('containerProxy');

这是[root]/library/classes/DependencyInjection.php的定义:

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
USE Symfony\Component\DependencyInjection\Container;

class DependencyInjection extends ContainerBuilder
{
    ....
}

这里有什么问题?为什么自动加载器找不到那个类?

【问题讨论】:

    标签: php composer-php psr-4 psr-0


    【解决方案1】:

    您正在尝试加载“类”命名空间,但是您的类未定义为位于“类”命名空间中。

    PSR-0 中的new classes\DependencyInjection(...) 加载{paths}\classes\DependencyInjection.php 并尝试从命名空间classes 实例化类DependencyInjection,但DependencyInjection 不在classes 命名空间中。该文件将加载,但该类不存在。

    您可以将namespace classes; 添加到这些类中的每一个,但这并不是一个好的解决方案。更好的解决方案是使用正确的命名空间或更改您的 PSR-0 列表以包含库/类并使用 new DependencyInjection(...)。 (我的投票是第一个——使用适当的命名空间。)

    根据要求。示例:

    文件位置
    {app}\library\UsefullNamespace\DependencyInjection.php

    调用它使用 new UsefullNamespace\DependencyInjection.php

    依赖注入.php:

    namespace UsefullNamespace;  
    
    use [...];  
    
    class DependencyInjection extends ContainerBuilder
    {
    

    【讨论】:

    • 另外...如果您不是绝对必须使用,请不要使用 ZF1。它已完全弃用/生命周期结束/不再维护。
    • 你能补充一些例子吗?两种解决方案?
    • 添加了——替代方案并不是真正的解决方案,甚至可能不适用于 PSR-0(不确定)。一个有用的命名空间是对你的应用真正有意义的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多