重构代码时,需要帮助解决PHP中的“未找到类”错误吗
我刚刚开始深入研究PHP OOPs的概念。为此,我在同一个文件中创建了一个类和一个接口。到目前为止一切都很顺利。此外,我开始重构代码,并将类和接口分离到各自的文件中。在此之后,我得到以下错误: 致命错误:在第4行的E:\www\project\oop\Tasks.php中找不到接口“TaskInterface” 下面的行解决了这个错误,但我需要一种通过Composer和命名空间解决它的方法重构代码时,需要帮助解决PHP中的“未找到类”错误吗,php,oop,Php,Oop,我刚刚开始深入研究PHP OOPs的概念。为此,我在同一个文件中创建了一个类和一个接口。到目前为止一切都很顺利。此外,我开始重构代码,并将类和接口分离到各自的文件中。在此之后,我得到以下错误: 致命错误:在第4行的E:\www\project\oop\Tasks.php中找不到接口“TaskInterface” 下面的行解决了这个错误,但我需要一种通过Composer和命名空间解决它的方法 require 'TaskInterface.php'; 这两个文件都在同一目录级别下 类任务:(Tas
require 'TaskInterface.php';
这两个文件都在同一目录级别下
类任务:(Tasks.php)
接口任务:(TaskInterface.php)
下面是自动加载类/接口的composer.json代码:
{
"name" : "OOP",
"autoload": {
"psr-4": {
"App\\": "project/oop/"
}
}
}
项目URL:
目录结构:
|project
|oop
-|vendor
-|composer (containing all auto generated files)
-|autoload.php
-|composer.json
-|TaskInterface.php
-|Tasks.php
我不确定你错过了哪一步,但这应该是一个完全有效的例子 假设目录结构如下:
├── composer.json
├── project
│ └── oop
│ ├── TaskInterface.php
│ └── Tasks.php
└── vendor
├── autoload.php
project/oop/TaskInterface.php
重要部分
- 每个包含类或接口定义的文件都应该声明一个名称空间
- 更深的命名空间声明将在project/oop/下面的更深的目录中查找。如果在
命名空间中声明一个类Product,则源文件必须位于project/oop/Foo/Product.php中App/Foo
- 当引用与当前文件位于同一命名空间中的类或接口时,不需要use语句
- 入口点(在本例中为Tasks.php)必须包括Composer autoloader
- 您通常不会像在Tasks.php中那样混合使用类定义和过程代码,但没有理由不这样工作。更常见的情况是,在目录结构的更高层有一个共享的“前端控制器”,其中包括自动加载程序和任何其他引导程序
<?php
require_once(__DIR__ . '/vendor/autoload.php');
use App\Tasks;
$obj = new Tasks();
echo $obj->create();
如何包含/自动加载文件?你需要做一个或另一个,当你引用一个类/接口名时,PHP不会自动知道在文件系统的什么地方查找。你加载过这个接口吗?你在使用自动加载程序吗?@iainn和nath开发者我用composer自动加载文件。请查看已编辑的问题。您的Composer配置告诉自动加载程序在project/oop/
下查找App
命名空间中的文件,但您的类和接口看起来根本不在命名空间中。@iainn我已声明了命名空间,但仍然存在相同的错误。请看编辑后的问题。非常感谢您的回答和非常有用的解释。
├── composer.json
├── project
│ └── oop
│ ├── TaskInterface.php
│ └── Tasks.php
└── vendor
├── autoload.php
<?php
namespace App;
interface TaskInterface {
public function create();
}
<?php
namespace App;
require_once(__DIR__ . '/../../vendor/autoload.php');
class Tasks implements TaskInterface {
public function create()
{
var_dump('created');
}
}
$obj = new Tasks();
echo $obj->create();
{
"name" : "OOP",
"autoload": {
"psr-4": {
"App\\": "project/oop/"
}
}
}
$ composer dump-autoload
Generating autoload files
$ php project/oop/Tasks.php
string(7) "created"
<?php
require_once(__DIR__ . '/vendor/autoload.php');
use App\Tasks;
$obj = new Tasks();
echo $obj->create();