Php异常致命错误“名称已被使用”

时间:2012-08-16 14:02:55

标签: php namespaces

在我的本地开发机器上(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兼容)中。我在/my/src/Shop/Repository/Day.php上有一个Shop\Repository\Day

但是,在我的登台服务器(php 5.3.10)上,我收到以下错误:

  

PHP致命错误:无法使用Shop \ Entity \ Day作为Day,因为该名称已在第5行的/my/src/Shop/Repository/Product.php中使用

我能理解这条消息,如果我将我的Shop \ Entity \ Day别名导入DayEntity,代码就可以了。但是我无法理解致命错误的原因:为什么这可以在php 5.3.14上工作(或者至少在我的配置中)而不是5.3.10(或者至少在服务器的配置下)?

我想问题是因为在命名空间Shop\Repository中已经加载了Day。但这从来没有导致我的设置错误!发生了什么事?

1 个答案:

答案 0 :(得分:7)

以下是我抓住这种情况的一些解释:

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()来查看你的服务器和工作站有什么不同,因为加载它们的顺序很重要

这些解释与this nice post

评论的dmitry相关联

希望这可以提供帮助