Поэтому у меня есть очень простой набор файлов:'Класс не найден', даже если файл правильно включен
main.php
include_once 'User.php';
echo 'im here'; //never reached!
$user = new My\Test\User();
...
User.php
namespace My\Test;
include_once 'Student.php';
class User {...}
Student. php
namespace My\Test;
include_once 'User.php';
var_dump(in_array('User.php', get_included_files())); //true
var_dump(class_exist('User')); //false
var_dump(class_exist('\My\Namespace\User')); //false
var_dump(class_exist('My\Namespace\User')); //false - How can that be?
class Student extends User {...} //Fatal Error: Class My\Namespace\User not found
Так что происходит здесь, так это то, что Пользовательский класс включен сначала из main.php. Поскольку у него есть некоторые статические методы, которые создают экземпляры студентов, а также он должен включать в себя файл класса студентов. Файл «Студенты», поскольку он расширяет «Пользователь», также включает User.php, но это не должно выполняться, поскольку я использовал include_once. Я даже проверяю, был ли файл включен правильно, но несколько строк позже я получаю фатальную ошибку. Оба файла имеют одинаковое пространство имен.
Забавно, что до того, как я применил пространства имен к моим классам, все сработало, поэтому я предполагаю, что это какая-то ошибка с кросс-файлами с одинаковым пространством имен.
Попытался удалить include_once из Student.php, это не имеет никакого значения.
Если main.php содержит User.php, а User.php включает Student.php, почему cant Student.php не найдет класс пользователя ?!
Я на PHP версии 5.5.9
Смотрите мой ответ - Вы можете немного изменить свой пост, так как пример имен вы перечислили здесь «пространство имен» - которая не является допустимое имя пространства имен. В моем ответе я изменил ваше пространство имен на «MyNamespace» - но с использованием фактического пространства имен, с которым у вас возникли проблемы с вашим вопросом, вы сможете убедиться, что ответ верен для ваших нужд. –