【问题标题】:Composer Autoloading classes not found未找到 Composer 自动加载类
【发布时间】:2017-02-28 19:36:48
【问题描述】:

我的文件夹结构如下:

includes/
  libraries/
    Classes/
      Contact/
        Contact.php
        ContactController.php

admin/
  controllers/
    contact/
      edit.php

Contact.php 是我尝试使用的文件的类。该文件包含。

<?php
namespace Classes;

class Contact {
    function __construct() {
        die('here');
    }
}

我的 composer.json 文件如下:

{
    "autoload": {
        "psr-4": {
            "Classes\\": "includes/libraries/Classes/"
        }
    },
}

我尝试在其中使用 Contact 类的文件是 edit.php 文件夹中的 admin/controllers/contact/。我的edit.php 文件是这样的:

<?php

use Classes\Contact;

$contact = new Contact();

var_dump($contact);

此文件包含vendor/autoload.php 文件,但我似乎无法让它使用该类?

【问题讨论】:

    标签: php namespaces composer-php autoload


    【解决方案1】:

    Classes/Contact/Contact.php 和作曲家规则 "Classes\\": "includes/libraries/Classes/" 暗示 Classes\Contact\Contact 类,而不是 Classes\Contact

    因此,如果您确实需要 Classes\Contact 类,请将 Classes/Contact/Contact.php 文件移至父目录:Classes/Contact.php

    但是,如果所需的类的命名空间路径是 Classes\Contact\Contact,则更改 use

    use Classes\Contact\Contact;
    

    还有namespace

    namespace Classes\Contact;
    
    class Contact {}
    

    示例

    ├── composer.json
    ├── includes
    │   └── libraries
    │       └── Classes
    │           └── Contact
    │               └── Contact.php
    ├── test.php
    └── vendor
        ├── autoload.php
        └── composer
            ├── autoload_classmap.php
            ├── autoload_namespaces.php
            ├── autoload_psr4.php
            ├── autoload_real.php
            ├── autoload_static.php
            ├── ClassLoader.php
            ├── installed.json
            └── LICENSE
    

    vendor/下的文件是composer生成的。

    composer.json

    {
        "name": "testpsr4",
        "autoload": {
            "psr-4": {
                "Classes\\": "includes/libraries/Classes"
            }
        }
    }
    

    test.php

    <?php
    require_once __DIR__ . '/vendor/autoload.php';
    
    use Classes\Contact\Contact;
    
    $c = new Contact;
    $c->test();
    

    includes/libraries/Classes/Contact/Contact.php

    <?php
    namespace Classes\Contact;
    
    class Contact {
        public function test () {
            echo __METHOD__, PHP_EOL;
        }
    }
    

    测试

    composer update
    php test.php
    

    输出

    Classes\Contact\Contact::test
    

    【讨论】:

    • 好的,那我应该有规则use Classes/Contact/Contact; 吗?
    • @RyanHipkiss,不,只需将 PHP 文件移动到父目录即可。啊,如果你想要Classes/Contact/Contact,那么是的,不要移动文件,并更改use
    • 或者使用命名空间Classes\Contact而不是Classes
    • 谢谢大家,我会试试这个。
    • @RuslanOsmanov 我已将其更改为使用新的用途和命名空间,并重新运行composer dump-autoload,但没有结果。仍未找到课程。
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2020-01-21
    • 2019-01-22
    • 2019-04-20
    • 2020-11-03
    相关资源
    最近更新 更多