Подтвердить что ты не робот

Проблема с интерфейсом PHP - класс не найден

Привет, у меня очень простой класс, который реализует интерфейс. И класс, и интерфейс находятся в одном файле.

Когда я реализую интерфейс, я получаю фатальную ошибку "Класс не найден", но когда я удаляю инструменты, а затем пытаюсь использовать класс, я могу использовать его в порядке.

Может кто-нибудь предложить какие-либо советы по этому поводу?

Извините, вот какой-то код, который я использую для тестирования на данный момент:

$tester = new TypeOneTester();
$tester->test("Hello");

interface iTestInterface
{
    public function test($data);
}

class TypeOneTester implements iTestInterface
{
    public function test($data)
    {
        return $data;
    }
}
4b9b3361

Ответ 1

Создайте экземпляр вашего класса после определения класса и интерфейса, а не раньше.

Порядок определения в этом случае должен быть:

  • Интерфейс
  • Класс
  • Экземпляр класса (объектов)

Ответ 2

Это (очень плохое) документированное ограничение:

http://php.net/manual/pl/migration5.incompatible.php

В некоторых случаях классы должны быть объявлены перед использованием. Это происходит только в том случае, если используются некоторые новые функции PHP 5 (такие как интерфейсы). В противном случае поведение будет старым.

Тем не менее я подал сообщение об ошибке. IMO он должен быть исправлен, поскольку это противоречивое поведение, и сообщение об ошибке не полезно для всех, кто предполагает, что я сделал это, PHP просто не интересовался, где вы объявляете функции/классы. Давай, он там уже более 10 лет...

https://bugs.php.net/bug.php?id=69665

Ответ 3

пахнет как ошибка в php. Удостоверьтесь, что он воспроизводится с последней версией и отправляется на bugs.php.net.

Воспроизвести код

interface I {}

$a = new A;
$b = new B;

class A {
    function __construct() { echo 'A'; }
}

class B implements I {
    function __construct() { echo 'B'; }
}

Ожидаемое

AB

Actual:

A
Fatal error: Class 'B' not found...

Ответ 4

Это связано с тем, что интерфейс загрузки php и экземпляр класса класса, где есть определенный порядок и должен находиться в файле Php, если файл не соответствует порядку 1. Require_one interface, 2. Require_one класс

Ответ 5

Прежде всего вы должны проверить, что интерфейс require_once (или include) может быть загружен до того, как ваш php файл класса

require_once 'classes/I3D.php';
require_once 'classes/book.php';