PSR-4 没有加载我的项目类

Posted

技术标签:

【中文标题】PSR-4 没有加载我的项目类【英文标题】:PSR-4 not loading my project classes 【发布时间】:2018-02-05 07:41:51 【问题描述】:

我正在使用 Composer 的 PSR-4 来自动加载类,但它不会加载我的类。 每次我尝试使用我的一个类时,应用程序都会在没有任何错误的情况下死掉,即使它应该显示错误。

这是我的文件结构:

/
│   composer.lock
│   composer.json
│   index.php
├───src
│       Array.php
│       File.php
├───vendor
        ...

composer.json - 自动加载部分

"autoload": 
    "psr-4": 
        "FileManager\\": "src"
    

index.php 的开始

<?php

require(__DIR__ . '/vendor/autoload.php');

var_dump(class_exists('Array'), class_exists('Array', false));
var_dump(class_exists('File'), class_exists('File', false));

它会转储这个:

bool(false)
bool(false)
bool(false)
bool(false)

如果我添加

use FileManager\Array;

它会立即死亡。如果我添加

use FileManager\File;

它不会死,但它也不会识别 File 类。

我跑了

$ composer dumpautoload

有人可以帮我吗?

【问题讨论】:

您需要在 composer 文件中的 psr-4 声明中的目标后面添加一个斜杠:"FileManager\\": "src/"。然后运行composer dump-autoload @MagnusEriksson 没有帮助。 autoload-psr4.php 仍然有这个数组:'FileManager\\' =&gt; array($baseDir . '/src'),。即使在运行composer dump-autoload之后。 您在更改作曲家文件后是否运行composer dump-autoload @MagnusEriksson 是的,我做到了。 我只是查看了一个正常工作的 autoload_psr4.php 文件。那是正确的。这就是它的存储方式(我在该文件中也没有尾部斜杠)。您是否在文件的最顶部正确设置了文件ArrayFile 中的命名空间? namespace FileManager;? 【参考方案1】:

问题是您将strings 传递给class_exists()

如果您使用string 值来引用类名,则需要使用完全限定的类名

<?php

require_once __DIR__ . '/vendor/autoload.php';

var_dump(
    class_exists('FileManager\ArrayUtil'),
    class_exists('FileManager\File')
);

或者,您可以使用 class 关键字(至少需要 PHP 5.5):

<?php

use FileManager\ArrayUtil;
use FileManager\File;

require_once __DIR__ . '/vendor/autoload.php';

var_dump(
    class_exists(ArrayUtil::class),
    class_exists(File::class)
);

参考见:

http://php.net/manual/en/language.namespaces.dynamic.php http://php.net/manual/de/migration55.new-features.php#migration55.new-features.class-name http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class

【讨论】:

以上是关于PSR-4 没有加载我的项目类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel psr-4 不自动加载

PSR-4 自动加载器致命错误:找不到类

在 Laravel 中无法自动加载 psr-4

使用 Composer 自动加载 PSR-4

使用PSR-4配合composer autoload 自动加载文件夹

composer+psr-4实现自动加载