Composer自动加载类找不到

19

我有以下文件夹结构:

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 class),它所在的文件是 admin/controllers/contact/edit.php。我的 edit.php 文件如下:

<?php

use Classes\Contact;

$contact = new Contact();

var_dump($contact);

这个文件已经包含了vendor/autoload.php文件,但我似乎无法使用该类?

1个回答

24

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

因此,如果您实际上想要Classes\Contact类,则将Classes/Contact/Contact.php文件移动到父目录:Classes/Contact.php

然而,如果所需的类的命名空间路径为Classes\Contact\Contact,则更改使用

use Classes\Contact\Contact;

还有命名空间

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; 吗? - Ryan Hipkiss
@RyanHipkiss,不,只需将PHP文件移动到父目录即可。啊,如果你想要Classes/Contact/Contact,那么不要移动文件,改变use即可。 - Ruslan Osmanov
请使用命名空间Classes\Contact代替Classes - wazelin
谢谢大家,我会尝试这个。 - Ryan Hipkiss
2
@RuslanOsmanov 我已经更改了使用新的 use 和 namespaces 的方式,并重新运行了 composer dump-autoload,但没有结果。类仍然找不到。 - Ryan Hipkiss
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接