【问题标题】:Trouble with Composer Autoloading: not loading all filesComposer 自动加载问题:不加载所有文件
【发布时间】:2015-05-09 12:57:29
【问题描述】:

我一直在构建自己的网络应用程序有一段时间了,但由于 PHP 中的一个致命错误而完全碰壁。

简短的故事:我正在处理项目的登录/用户部分。 login.php 处理登录信息,student.php 处理帐户信息。

当尝试完成doLogin 时,我遇到了致命错误,指出student::getProfile() 是一个“未定义的方法”。 student::getProfile()login 类中作为validate() 的一部分被调用。

任何帮助将不胜感激!谢谢:)

编辑:在@deceze 的帮助下,我已经能够将问题缩小到 Composer 没有自动加载我的类的所有;只有一些。有人可以帮忙吗?

编辑 2: 我检查了由 Composer 生成的autoload_classmap.php,我的所有核心类和模型都列出了!如果它们列在类映射中,为什么 Composer 不加载它们?


项目目录

application/
    config/
    controller/
    core/
        (core items such as auth, app, view rendering + view controller)
    model/
        (speciality functions such as login, registration + user)
    view/
public/
    index.php
    .htaccess
vendor/
    autoload.php
composer.json
.htaccess

note: /public/index.php calls `require '../vendor/autoload.php';`

composer.json

"autoload": {
    "psr-4": {
        "": [
            "application/core/",
            "application/model/"
        ]
    }
}

【问题讨论】:

  • 一开始就在 login.php 中包含那个 student.php 文件。
  • @deceze Call to undefined method student::getProfile() in login.php
  • 应该工作。唯一的解释是该文件未包含在内。
  • 通过添加echo "I'm included!" 来简单地确认文件是否被包含。唯一的其他解释是名称空间和/或代码中某处的不可见字符;即类或函数的名称实际上不同。
  • 因此您已将问题范围缩小为自动加载器的问题。请相应地重写问题以专注于这一点,这不会在 cmets 中解决。

标签: php composer-php


【解决方案1】:

经过大量乏味的搜索,我发现了我的方法中的错误 - 这很愚蠢!

我有一个名为 student 的控制器,同时还有一个名为 student 的模型,因此我无意中尝试调用一个在技术上已经被调用的类。因此,它在第一个 student 类中查找该函数,而不是另一个实际上包含该特定函数的类。

Composer 没有意识到是否已经有一个预先声明了该名称的类,并且只是在 PHP 错误日志中没有任何条目的情况下否定它。

为了避免这个错误 - 以及将来任何进一步的类名混淆 - 我决定为 core 类和 model 类使用单独的命名空间。这会将这些类分成“子部分”,从而允许使用命名相同的类(尽管在不同的命名空间中)。


PHP Manual: Namespaces

Sitepoint: How to Use PHP Namespaces, Part 1: The Basics

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2018-07-11
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2013-06-16
    • 1970-01-01
    • 2018-11-26
    相关资源
    最近更新 更多