Нужна помощь в решении проблемы не найденных ошибок в PHP при рефакторинге кода - PullRequest
0 голосов
/ 11 мая 2018

Я только начал копаться в концепции ООП PHP.Для этого я создал класс и интерфейс в одном файле.До этого момента все работает хорошо.Далее я начал рефакторинг своего кода и разделил класс и интерфейс на соответствующие файлы.После этого я получаю сообщение об ошибке ниже:

Неустранимая ошибка: интерфейс 'TaskInterface' не найден в E: \ www \ project \ oop \ Tasks.php в строке 4

Ниже строка решает эту ошибку, однако мне нужен способ ее устранения с помощью Composer и Namespace.

require 'TaskInterface.php';

Оба файла находятся на одном уровне каталогов.

Задачи класса: (Задачи.php)

use App\TaskInterface;
require_once 'vendor/autoload.php';
class Tasks implements TaskInterface {
 public function create()
 {
    var_dump('created');
 }
}
$obj = new Tasks();
echo $obj->create();

Задача интерфейса: (TaskInterface.php)

namespace App;
interface TaskInterface {
 public function create();
}

Вот код composer.json для автозагрузки класса / интерфейса:

{
"name" : "OOP",
"autoload": {
    "psr-4": {
        "App\\": "project/oop/"
    }
 }
}

URL проекта: http://localhost/project/oop/tasks.php

Структура каталогов:

|project
|oop
  -|vendor
     -|composer (containing all auto generated files)
     -|autoload.php
  -|composer.json
  -|TaskInterface.php
  -|Tasks.php

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

В дополнение к ответу @iainn вы можете создать точку входа (index.php) для вашего проекта с несколькими строками кода.

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use App\Tasks;
$obj = new Tasks();
echo $obj->create();

Поместите этот файл на тот же уровень композитора.json.Не забудьте удалить require_once ... из Tasks.php

0 голосов
/ 11 мая 2018

Я не уверен, какой шаг вы пропустили, но это должен быть полностью рабочий пример.

Предполагая следующую структуру каталогов:

├── composer.json
├── project
│   └── oop
│       ├── TaskInterface.php
│       └── Tasks.php
└── vendor
    ├── autoload.php

Проект / уп / TaskInterface.php

<?php
namespace App;

interface TaskInterface {
  public function create();
}

проект / уп / Tasks.php

<?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();

composer.json

{
  "name" : "OOP",
  "autoload": {
    "psr-4": {
      "App\\": "project/oop/"
    }
 }
}

$ composer dump-autoload
Generating autoload files

$ php project/oop/Tasks.php
string(7) "created"

Важные части

  • Каждый файл, содержащий определение класса или интерфейса, должен объявлять пространство имен
  • Более глубокие объявления пространства имен будут просматриваться в более глубоких каталогах под project / oop / . Если вы объявите класс Product в пространстве имен App/Foo, ваш исходный файл должен находиться в project / oop / Foo / Product.php .
  • При ссылке на класс или интерфейс в том же пространстве имен, что и текущий файл, оператор use не требуется
  • Точка входа (в данном случае Tasks.php ) должна включать автозагрузчик Composer
  • Обычно вы не смешали бы определение класса и процедурный код, как вы это делали в Tasks.php , но нет никаких причин, по которым это не сработает. Чаще у вас будет общий «фронт-контроллер», расположенный выше по структуре каталогов, который будет включать автозагрузчик и любую другую загрузку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...