【问题标题】:PHP Composer Autoloader Class not Found ExceptionPHP Composer Autoloader 类未找到异常
【发布时间】:2015-02-17 16:47:44
【问题描述】:

标题会说话。所以这是我的项目结构:

|src
    |Database
        |Core
            |MySQL.php
        |Support
    start.php
|vendor
composer.json
index.php

MySQL.php 文件:

<?php
namespace Database\Core;
//Some methods here

index.php 和 start.php 文件:

//start.php file
<?php
require __DIR__ . '/../vendor/autoload.php';
?>

//index.php file
<?php
use Database\Core;
require __DIR__ . '/src/start.php';

$mysql = new MySQL(); // Gets exception Class 'MySQL' cannot found etc.
?>

最后是我的 composer.json 自动加载部分:

"autoload": {
    "psr-4": "Database\\": "src/" // Also tried "src/Database" too
}

问题出在哪里?我真的厌倦了试图应对这种情况。请帮助伙计们!谢谢。

【问题讨论】:

    标签: php composer-php autoloader


    【解决方案1】:

    在初始化类时需要包含命名空间:

    $mysql = new Database\Core\MySQL();
    

    use Database\Core\MySQL;
    $mysql = new MySQL();
    

    Using namespaces: Aliasing/Importing

    【讨论】:

    • 谢谢我真的很感激,但由于声誉低而无法投票:)
    【解决方案2】:

    除了不使用已经提到的正确的use 语句之外,PSR-4 不能这样工作。它更像是一个别名。你本质上是说src 等于Database。因此,在其中有一个名为 Database 的目录意味着完全限定的命名空间 + 类等于“Database\Database\Core\MySQL”。在这种情况下,您想使用 PSR-0,或者调整您的 PSR-4 定义。

    【讨论】:

    • 扩展一下这个好答案:你不希望你的命名空间是像“数据库”这样的通用名称。您想使用其他 php 包可能已经使用的东西,因此您的公司/组织的名称是一个不错的选择,例如如果您的公司名为 Acme Baseball Cards,则一个好的命名空间可能是“AcmeBaseball”。在您的 Mysql.php 文件中,命名空间将是 namespace AcmeBaseball\Database\Core; 和 composer.json "psr-4": "AcmeBaseball\\": "src/" 如果您安装像 AWS Php SDK 这样的作曲家包,您会注意到这一点;打开他们的compser.json,命名空间是Aws
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2015-08-08
    • 2015-03-05
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多