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\\' => array($baseDir . '/src'),
。即使在运行composer dump-autoload
之后。
您在更改作曲家文件后是否运行composer dump-autoload
?
@MagnusEriksson 是的,我做到了。
我只是查看了一个正常工作的 autoload_psr4.php 文件。那是正确的。这就是它的存储方式(我在该文件中也没有尾部斜杠)。您是否在文件的最顶部正确设置了文件Array
和File
中的命名空间? namespace FileManager;
?
【参考方案1】:
问题是您将string
s 传递给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 没有加载我的项目类的主要内容,如果未能解决你的问题,请参考以下文章