Проблема с интерфейсом PHP - класс не найден - PullRequest
11 голосов
/ 14 сентября 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 14 сентября 2010

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

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

  1. Интерфейс
  2. Класс
  3. Экземпляр класса (объекты)
5 голосов
/ 20 мая 2015

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

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

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

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

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

3 голосов
/ 14 сентября 2010

пахнет как ошибка в 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

Фактический:

A
Fatal error: Class 'B' not found...
2 голосов
/ 14 января 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...