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

Необычная фатальная ошибка Php с "именем уже используется"

На моей локальной машине разработки (php 5.3.14) я могу использовать такой класс:

<?php

namespace Shop\Repository;

use Shop\Entity\Day;
use Doctrine\ORM\EntityRepository;

class Product extends EntityRepository
{
    // Code
}

Класс хранится в /my/src/Shop/Repository/Product.php(соответствует PSR-0). У меня также a Shop\Repository\Day, расположенный по адресу /my/src/Shop/Repository/Day.php.

Однако на моем промежуточном сервере (php 5.3.10) я получаю следующую ошибку:

PHP Неустранимая ошибка: нельзя использовать Shop\Entity\Day как Day, потому что имя уже используется в /my/src/Shop/Repository/Product.php в строке 5

Я могу понять сообщение, если я перечислил псевдоним моего магазина \Entity\Day для DayEntity, код работает. Но я не могу понять причину фатальной ошибки: почему это работает на php 5.3.14 (или, по крайней мере, с моей конфигурацией), а не с 5.3.10 (или, по крайней мере, с конфигурацией сервера)?

Я думаю, проблема в том, что в пространстве имен Shop\Repository уже загружен Day. Но это никогда не приводило к ошибкам в моей настройке! Что происходит?

4b9b3361

Ответ 1

Вот некоторые объяснения, которые я схватил об этой ситуации:

require_once 'ns_class2.php';
// 
namespace ns; // Declaration of the namespace named "ns"
class class2 {} // Declaration of the class "ns/class2"
// In the namespace "ns", "class2" is an alias of  "ns\class2"
// 


require_once 'ns_ns1_ns2_class2.php';
// 
namespace ns\ns1\ns2; // Declaration of the namespace named "ns\ns1\ns2"
class class2 {} // Declaration of the class "ns\ns1\ns2\class2"
// In the namespace "ns\ns1\ns2", "class2" is an alias of "ns\ns1\ns2\class2"
//  

require_once 'ns_ns1_ns2_class1.php';
// 
namespace ns\ns1\ns2; // Declaration of the namespace named "ns\ns1\ns2"
// In the namespace "ns\ns1\ns2", "class2" is an alias of "ns\ns1\ns2\class2"
use ns\class2; // Creation of the alias  "class2" which point to "ns\class2" but class2 is already an alias of ns\ns1\ns2\class2 => ERROR 

Итак, вы должны попробовать с get_included_files(), чтобы видеть на вашем сервере и на станции, что такое разные, потому что порядок их загрузки важен.

Эти объяснения связаны с этот приятный пост, который был прокомментирован dmitry

Надеюсь, это поможет