当前位置: 首页 > 知识库问答 >
问题:

自动加载

逑翰翮
2023-03-14

我在使用Composer设置类自动加载方面遇到了很多麻烦,在这一点上,我已经阅读并观看了数以百万计的参考资料

一些快速版本信息:

  • PHP-v5。6.17

项目布局比较简单:

.
├── composer.json
├── framework
│   ├── classes
│   │   ├── Test1.php
│   ├── config
│   │   ├── Test2.php
│   ├── financial.html
│   ├── form.html
│   ├── index.php
│   ├── models
│   │   ├── Base.php
│   ├── sample.html
│   └── services
│       └── validate.service.php
├── phpunit.xml
├── test
│   └── FormTest.php
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── autoload_classmap.php
    │   ├── autoload_files.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_psr4.php
    │   ├── autoload_real.php
    │   ├── ClassLoader.php
    │   ├── installed.json
    │   └── LICENSE
    └── constants.php

“composer.json”当前包含以下内容:

{
    "name":             "testframework",
    "require": {
        "PHP":              ">=5.6.17"
    },
    "autoload": {
        "psr-4": {
            "Config\\":     "framework/config/",
            "Classes\\":    "framework/classes/",
            "Models\\":     "framework/models/"
        },
        "files": [
            "vendor/constants.php"
        ]
    }
}

每当我更改目录结构、重命名类或修改“composer.json”时,我都会运行:

% composer validate (only when modifying "composer.json")
% composer dump-autoload -o

我的目标是从“框架”中的“类”、“配置”和“模型”文件夹中自动加载所有类;“index.php”当前实现“framework/models/Base.php”,如下所示。

<?php
    require_once( dirname( __DIR__ ) . '/vendor/autoload.php' );

    use Models\Base;

    $derp = new BaseModel();
?>

我已经验证了上述各项是否指向正确的位置

基础php包含以下脚本:

<?php namespace Models;

    class BaseModel {
        public $submitAction    = null;

        protected $complete;

        public function __construct() {}

        /**
         *  Expose
         *      Exposes the error code names for external processing.
         *
         *  @return An array containing all error code names in this object.
         */
        public static function Expose() {
            $reflector  = new ReflectionClass( 'ErrorCodes' );

            return $reflector->getConstants();
        }
    }

我已经经历了我能想到的命名空间的每一个排列,一直在无休止地修改“composer.json”,根据留档添加和删除片段,纯粹使用类映射(不起作用),测试“PSR-0”(也不起作用),使用更大的锤子(也没用)。

很明显,我做错了一些可怕的事情,我只是不知道是什么;有人能看到我误入歧途的地方吗?

非常感谢,N00b

编辑:“vendor/composer”目录包含以下与composer的自动加载相关的内容。

“autoload_classmap.php”:

<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Models\\BaseModel' => $baseDir . '/framework/models/Base.php',
);

“autoload_files.php”:

<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'a9da57e70f975fe4a3c7dad63939dcd8' => $vendorDir . '/constants.php',
);

和“autoload_psr4.php”:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Models\\' => array($baseDir . '/framework/models'),
    'Config\\' => array($baseDir . '/framework/config'),
    'Classes\\' => array($baseDir . '/framework/classes'),
);

我看到的错误来自PHP:

致命错误:在/var/www/testproject/framework/index中找不到类“BaseModel”。php第8行

和PHPUnit:

用户%phpunit phpunit 4.2。塞巴斯蒂安·伯格曼著。

从/var/www/testproject/phpunit读取配置。xml

PHP致命错误:在/var/www/testproject/test/FormTest中找不到类“BaseModel”。php第6行

共有1个答案

郜谦
2023-03-14

索引中。php您没有导入正确的类:

use Models\Base;

$derp = new BaseModel();

您应该导入Models\BaseModel类:

use Models\BaseModel;

$derp = new BaseModel();

此外,文件名应与类名匹配。BaseModel类应位于framework/models/BaseModel中。php文件,而不是框架/模型/基础。php

请注意,您不需要在开发过程中优化自动加载程序(这就是-o标志正在做的事情)。只能在生产中使用它,否则每次添加新类时都必须转储自动加载器。

更多关于自动加载标准的信息可以在这里阅读:

  • http://www.php-fig.org/psr/psr-4/
  • http://www.php-fig.org/psr/psr-0/
 类似资料:
  • 我们已经为我们的Potion插件写了大量的功能,覆盖了本书所要讲的内容。 在结束之前,我们将讲到一些非常重要的方法,可以给我们的插件锦上添花。 第一项是使用自动加载让我们的插件更有效率。 如何自动加载 目前,当用户加载我们的插件时(比如打开了一个Potion文件),所有的功能都会被加载。 我们的插件还很小,所以这大概不是什么大问题,但对于较大的插件,加载全部代码将会导致可被察觉的卡顿。 Vim使用

  • 这篇文章是对 PHP自动加载功能 的一个总结,内容涉及 PHP自动加载功能 、PHP命名空间、PSR0/PSR4标准 等内容。 一、PHP 自动加载功能 PHP 自动加载功能的由来 在 PHP 开发过程中,如果希望从外部引入一个 Class ,通常会使用 include 和 require 方法,去把定义这个 Class 的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,

  • Yii 依靠类自动加载机制来定位和包含所需的类文件。 它提供一个高性能且完美支持PSR-4 标准 的自动加载器。 该自动加载器会在引入框架文件 Yii.php 时安装好。 注意: 为了简化叙述,本篇文档中我们只会提及类的自动加载。 不过,要记得文中的描述同样也适用于接口和Trait(特质)的自动加载哦。 使用 Yii 自动加载器 要使用 Yii 的类自动加载器,你需要在创建和命名类的时候遵循两个简

  • 使用 spl_autoload_register() 来注册你的自动加载函数。 PHP 提供了若干方式来自动加载包含还未加载的类的文件。 老的方法是使用名为 __autoload() 魔术全局函数。 然而你一次仅能定义一个 autoload() 函数,因此如果你的程序包含一个也使用了 autoload() 函数的库,就会发生冲突。 处理这个问题的正确方法是唯一地命名你的自动加载函数,然后使用 sp

  • CodeIgniter 的"自动加载"特性可以允许系统每次运行时自动初始化类库、辅助函数和模型。 如果你需要在整个应用程序中全局使用某些资源,为方便起见可以考虑自动加载它们。 支持自动加载的有下面这些: libraries/ 目录下的核心类 helpers/ 目录下的辅助函数 config/ 目录下的用户自定义配置文件 system/language/ 目录下的语言文件 models/ 目录下的模

  • 我正在用Hubot框架开发一个应用程序,使用Heroku。我在Heroku上设置了一些配置变量,当我部署代码时,我的引用可以正常工作。