13

私のローカル開発マシン (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 致命的なエラー: 5 行目の /my/src/Shop/Repository/Product.php で名前が既に使用されているため、Shop\Entity\Day を Day として使用できません

メッセージを理解できます。Shop\Entity\Day インポートを DayEntity にエイリアスすると、コードが機能します。しかし、致命的なエラーの原因を理解できません: なぜこれは php 5.3.14 (または少なくとも私の構成) で機能し、5.3.10 (または少なくともサーバーの構成) では機能しないのですか?

Shop\Repository問題は、名前空間に既にDayロードされているためだと思います。しかし、これは私のセットアップでエラーにつながることはありません! どうしたの?

4

1 に答える 1

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_include_files() を試して、サーバーとステーションで違いを確認する必要があります。それらをロードする順序が重要であるためです。

これらの説明は、ドミトリーによってコメントされたこの素敵な投稿からリンクされています

これが役立つことを願っています

于 2012-08-16T14:29:46.217 に答える