2012-11-12 10 views
7

Quando si utilizza il modello pseudo namespacing di pera e Zend, è comune imbattersi in gerarchie di classe che assomigliano a questo:Cosa succede quando uno spazio dei nomi e una classe condividono un nome in PHP?

Zend/ 
    Db.php 
    Db/ 
     Expr.php 

Dove DB.php contiene una classe denominata Zend_Db e Expr.php contiene una classe denominata Zend_Db_Expr. Tuttavia, quando si tenta di convertire il vecchio namespacing 5.2 pseudo in PHP 5.3 namespacing si sono presentati con un caso in cui uno spazio dei nomi e una quota di classe un nome. Poiché l'operatore use può importare uno spazio dei nomi o un nome di classe, ciò porta ad ambiguità.

Ecco un esempio di un app che sto lavorando sulla conversione:

App/ 
    Core.php 
    Core/ 
     Autoloader.php 

Qui la directory di base e namespace sono App. Nel livello superiore dello spazio dei nomi è una classe Core:

namespace App; 
class Core { } 

Nella directory di base sono diverse altre classi principali, alcuni dei quali utilizzano il principale Core. Sotto il pattern pseudo namespacing, questo non è un problema. Ma nel modello di namespace reale crea questa situazione:

namespace App\Core; 
use App\Core as Core; // What is this importing? Namespace or class? 

class Autoloader { 
    public function __construct(Core $core) {} 
} 

È definito? Cosa viene importato qui?

+0

Qual è il problema? Non pensavo che potessi importare uno spazio dei nomi. Importi sempre un corso e gli dai un alias. –

+2

http://php.net/manual/en/language.namespaces.importing.php L'uso può importare una classe o uno spazio dei nomi. –

risposta

1

Semplicemente entrambi. Non è un'importazione reale, solo un suggerimento per il compilatore, che ogni incontro di questo alias nelle operazioni correlate alla classe dovrebbe essere esteso a questa dichiarazione. Nel namespace php è solo una parte della classe quindi pensateci come questo

$alias = 'Zend_Db'; 
$zendDB = new $alias; 
$aliasExpr = $alias . '_Expr'; 
$expr = new $aliasExpr; 
Problemi correlati