使用命名空间自动加载 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-autoload,install 执行,但不工作。所有这些在 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->add()
。
frontController.php 在根目录中。 IDK这一切我从linux复制并放在Windows上,就在这里我有问题。在 linux 上这项工作
也许与许可有关?你能检查 require 是否有效吗?
好吧,如果您使用 Composer 获取该供应商目录的内容,那么应该会自动加载这些内容。以上是关于使用命名空间自动加载 Composer 和 PSR-0 类的主要内容,如果未能解决你的问题,请参考以下文章