重构代码时,需要帮助解决PHP中的“未找到类”错误吗

重构代码时,需要帮助解决PHP中的“未找到类”错误吗,php,oop,Php,Oop,我刚刚开始深入研究PHP OOPs的概念。为此,我在同一个文件中创建了一个类和一个接口。到目前为止一切都很顺利。此外,我开始重构代码,并将类和接口分离到各自的文件中。在此之后,我得到以下错误: 致命错误:在第4行的E:\www\project\oop\Tasks.php中找不到接口“TaskInterface” 下面的行解决了这个错误,但我需要一种通过Composer和命名空间解决它的方法 require 'TaskInterface.php'; 这两个文件都在同一目录级别下 类任务:(Tas

我刚刚开始深入研究PHP OOPs的概念。为此,我在同一个文件中创建了一个类和一个接口。到目前为止一切都很顺利。此外,我开始重构代码,并将类和接口分离到各自的文件中。在此之后,我得到以下错误:

致命错误:在第4行的E:\www\project\oop\Tasks.php中找不到接口“TaskInterface”

下面的行解决了这个错误,但我需要一种通过Composer和命名空间解决它的方法

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/下面的更深的目录中查找。如果在
    App/Foo
    命名空间中声明一个类Product,则源文件必须位于project/oop/Foo/Product.php中
  • 当引用与当前文件位于同一命名空间中的类或接口时,不需要use语句
  • 入口点(在本例中为Tasks.php)必须包括Composer autoloader
  • 您通常不会像在Tasks.php中那样混合使用类定义和过程代码,但没有理由不这样工作。更常见的情况是,在目录结构的更高层有一个共享的“前端控制器”,其中包括自动加载程序和任何其他引导程序

除了@iainn答案之外,您还可以使用以下几行代码创建项目的入口点(index.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();