使用命名空间自动加载 Composer 和 PSR-0 类

Posted

技术标签:

【中文标题】使用命名空间自动加载 Composer 和 PSR-0 类【英文标题】:Composer and PSR-0 class autoloading with namespaces 【发布时间】:2013-11-30 16:53:18 【问题描述】:

大家好,我在使用 composer 自动加载我的课程时遇到问题。在 Linux 上一切正常,但现在我的老板改变了环境并设置了 Windows。所有这些都在 linux 上工作,但 windows 显示新手致命错误:

致命错误:在中找不到类“AbstractController” D:\xampp\htdocs\ikacFw\frontController.php 第 7 行

常见于我的 composer.json 和结构,以便更好地了解问题。

结构是:

frontController.php

-- vendor
----- Doctrine
----- Ikac
--------- Components
---------- Mvc
------------- Controller

我正在尝试从供应商目录加载所有数据。

Composer.json


    "autoload": 
        "psr-0": 
            "vendor": ""
        
    

我还添加了新组件手册。像这样:

$loader = require_once 'vendor/autoload.php'; 
$loader->add('vendor', "Ikac");

好的,接下来当我尝试调用时:

<?php
require_once 'vendor/autoload.php'; 

use Ikac\Mvc\Controller;


$a = new AbstractController();

我收到“未找到”错误。

我的类 AbstractController 包含已定义的命名空间,但不再工作。像测试我这样做:

    <?php
    //vendor/Ikac/Mvc/Controller/AbstractController.php

    namespace Ikac\Mvc\Controller;

    class AbstractController 

        function __construct() 
            echo __CLASS__;
        
    

    ?>

我从 cmd composer dump-autoloadinstall 执行,但不工作。所有这些在 linux 上的完美工作,但在这里不会。知道如何解决这个问题或我在哪里出错。

谢谢大家!

受宠:


    "autoload": 
        "psr-0": 
            "": "vendor/"
        
    

【问题讨论】:

那个“解决方案”指出“一切”都在“供应商”目录中。这可能是错误的。 【参考方案1】:

你应该这样做

<?php
require_once 'vendor/autoload.php'; 

use Ikac\Mvc\Controller\AbstractController;


$a = new AbstractController();

【讨论】:

我已经这样做了,你可以在帖子中看到。当我再次添加 \Controller 我得到一些错误 不,您错过了 use 关键字中的“AbstractController”最后一部分。当你“使用”一个类时,你必须指定完整的路径。 当我在最后一部分添加 AbstractController 关键字时,我再次遇到 ___ 致命错误:在___中找不到 Class 'Ikac\Mvc\Controller\AbstractController'【参考方案2】:

您的自动加载声明错误。

您永远不需要在任何自动加载中包含供应商文件夹。供应商文件夹将包含所有依赖项的自动加载,以及 - 如果已配置 - 也为您自己的类。

您可以使用 Composer 为您自己的类创建自动加载。只需包含正确的信息。但是从你目前的信息中我无法推断出什么是正确的。

【讨论】:

为什么你认为这是一个不好的说法?相同的过程使用 Simfony 框架。他们也有类似的声明getcomposer.org/doc/04-schema.md#autoload 您能否说明所有相关文件的位置? frontController.php在哪里,为什么vendor文件夹里的内容会在那里?我想它是 Composer 放在那里的 - 如果是这种情况,那么提到的 composer.json 是错误的,以及尝试调用 $loader-&gt;add() frontController.php 在根目录中。 IDK这一切我从linux复制并放在Windows上,就在这里我有问题。在 linux 上这项工作 也许与许可有关?你能检查 require 是否有效吗? 好吧,如果您使用 Composer 获取该供应商目录的内容,那么应该会自动加载这些内容。

以上是关于使用命名空间自动加载 Composer 和 PSR-0 类的主要内容,如果未能解决你的问题,请参考以下文章

Composer 的自动加载机制

作曲家自动加载器 psr-0 命名空间

Composer 自动加载几个路径作为一个命名空间

PSR-4 自动加载如何在 composer 中为自定义库工作?

PSR-0 自动加载错误

具有相同命名空间的不同 Composer 包