фатальная ошибка — класс не найден (в PHP)

Этот код работает без проблем:

<?php
namespace NamespaceA;
class A extends \NamespaceB\B {}

namespace NamespaceB;
class B {}

Но почему следующий код вызывает Неустранимая ошибка: класс ‘NamespaceB \ B’ не найден в … файле?

<?php
namespace NamespaceA;
class A extends \NamespaceB\B {}

namespace NamespaceB;
class B extends \NamespaceC\C {}

namespace NamespaceC;
class C {}

И этот код также работает без проблем:

<?php
namespace NamespaceA;
class A extends \NamespaceB\B {}

namespace NamespaceC;
class C {}

namespace NamespaceB;
class B extends \NamespaceC\C {}

UPD:
Без какого-либо пространства имен, также Неустранимая ошибка: класс «B» не найден в … файле:

<?php

class A extends B {}

class B extends C {}

class C {}

Работает без проблем:

<?php

class A extends B {}

class B {}

3

Решение

http://php.net/manual/en/keyword.extends.php

Классы должны быть определены до их использования. Если вы хотите, чтобы класс A расширял класс B, вам сначала нужно будет определить класс B. Порядок, в котором определяются классы, важен.

Редактировать:

Найдено больше:

Неустранимая ошибка при расширении включенного класса

После некоторых исследований стало ясно, что на самом деле вы можете использовать класс, прежде чем объявить его. Но объявление класса и всех родительских классов должно быть в одном файле.

Поэтому, если вы объявите родительский класс в одном файле и дочерний класс в другом, он не будет работать.

Кроме того, вы должны сначала объявить родительские классы. После этого вы можете расширить их.

Редактировать номер 2:

Итак, я провел еще несколько исследований по этому вопросу. Вероятно, есть некоторая внутренняя деталь реализации, которая в настоящее время позволяет работать одному случаю (я думаю, что это будет что-то, касающееся автозагрузки), однако это то, что может измениться в любое время и никогда не следует полагаться

1

Другие решения

Сначала используйте include_once (), чтобы добавить все файлы в индексный файл, а когда вы расширяете какой-либо класс, сначала создайте экземпляр этого родительского класса. Пример:

index.php-->
<?php
include_once('parentClass.php');
include_once('childClass.php');

$parentObj = new parent();
$childObj = new child();
?>

child.php-->
<?php
class child extends parent{
function __construct(){

}
}
?>
0