2012-08-16 14 views
13

En mi máquina de desarrollo local (PHP 5.3.14) Puedo utilizar una clase como esta:PHP error grave inusual con "nombre ya está en uso"

<?php 

namespace Shop\Repository; 

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

class Product extends EntityRepository 
{ 
    // Code 
} 

La clase se almacena en/mi/src /Shop/Repository/Product.php (compatible con PSR-0). Tengo también a Shop\Repository\Day ubicado en /my/src/Shop/Repository/Day.php.

Sin embargo, en mi servidor de ensayo (PHP 5.3.10) me sale el siguiente error:

PHP Fatal error: Cannot use Shop\Entity\Day as Day because the name is already in use in /my/src/Shop/Repository/Product.php on line 5

puedo entender el mensaje, si alias de mi tienda de importación \ Entidad \ Día a DayEntity, el código trabajos. Pero no puedo entender la causa del error fatal: ¿por qué funciona esto en php 5.3.14 (o al menos, con mi configuración) y no con 5.3.10 (o al menos, con la configuración del servidor)?

Supongo que el problema se debe a que en el espacio de nombres Shop\Repository ya hay un Day cargado. ¡Pero esto nunca condujo a errores en mi configuración! ¿Que esta pasando?

+0

'use Shop \ Entity \ Day como EntityDay;', o simplemente refiérase a él con su nombre completamente calificado y deshágase de la declaración 'use' por completo. Quizás vuelva a leer [esto] (http://www.php.net/manual/en/language.namespaces.importing.php) también. – DaveRandom

+0

Es obvio que obtendrá una colisión si importa una clase llamada Día a un espacio de nombres que ya tiene una clase llamada Día. En cuanto a por qué funciona en su configuración local; No puedo ver ninguna corrección de errores en el registro de cambios relacionado con los espacios de nombres entre 5.4.10 y 5.3.14. ¿Es posible que tu clase Repository \ Day no se haya utilizado localmente en el momento de cargar Entity \ Day? – Leigh

+0

@Leigh Estoy solicitando exactamente la misma página, con exactamente los mismos clones de git. Esto debe ser un problema de configuración (php) por lo tanto. –

Respuesta

7

Éstos son algunos explicación Agarré sobre esta situación:

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 

lo que debe tratar con get_included_files() para ver en el servidor y la estación de cuáles son los differentes debido a que el fin de cargar ellos es importante

Los explicación están vinculados desde this nice post que fue comentado por dmitry

la esperanza que esto podría ayudar a

Cuestiones relacionadas