2015-06-06 2 views
-1

Поэтому у меня есть очень простой набор файлов:'Класс не найден', даже если файл правильно включен

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

+0

Смотрите мой ответ - Вы можете немного изменить свой пост, так как пример имен вы перечислили здесь «пространство имен» - которая не является допустимое имя пространства имен. В моем ответе я изменил ваше пространство имен на «MyNamespace» - но с использованием фактического пространства имен, с которым у вас возникли проблемы с вашим вопросом, вы сможете убедиться, что ответ верен для ваших нужд. –

ответ

0

Ваш main.php не работает в правильном пространстве имен, когда он звонит, чтобы создать нового пользователя() ;.

Вам нужно указать пространство имен в main.php или использовать правильное пространство имен (я назвал пространство имен MyNamespace - поскольку ваш псевдо-код имел недопустимое имя пространства имен пространства имен).

<?php 
namespace MyNamespace; 

include_once 'User.php'; 

echo 'im here'; //never reached! 

$user = new User(); 

После изменения этого вы получаете:

Scotts-rMBP-3:bar smoore$ php main.php 
bool(false) 
bool(false) 
bool(true) 
bool(true) 
im here 
+0

Моя вина, это было просто для демонстрации. Я проверил его в своем коде, и я использовал полное имя пространства имен. Дело в том, что «im здесь» никогда не достигается (и, следовательно, новый пользователь()), Fatal Error вызывается в Student.php ... – felixfbecker

+0

Если вы посмотрите на результат выполнения вашего кода - я получу «im here» «используя пространство имен, которое я добавил в main.php. –

Смежные вопросы