2012-05-10 15 views
82

Ho un po 'di problemi con gli spazi dei nomi e le dichiarazioni use.Spazi dei nomi PHP e "uso"

Ho tre file: ShapeInterface.php, Shape.php e Circle.php.

Sto cercando di farlo usando percorsi relativi modo ho messo questo in tutte le classi:

namespace Shape; 

Nella mia classe cerchio ho il seguente:

namespace Shape; 
//use Shape; 
//use ShapeInterface; 

include 'Shape.php'; 
include 'ShapeInterface.php';  

class Circle extends Shape implements ShapeInterface{ .... 

Se uso le dichiarazioni include non ottengo errori. Se provo le dichiarazioni use ottengo:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

Qualcuno potrebbe darmi un po 'di orientamento sulla questione?

+0

ho letto questo e ancora non del tutto capito. I file esterni verranno inclusi con l'uso? –

+0

Anche riguardo a questo argomento - http: // stackoverflow.it/questions/33341955/does-the-import-or-use-order-affect-function-in-php – Peter

risposta

124

Il use operator serve per assegnare alias ai nomi di classi, interfacce o altri spazi dei nomi. La maggior parte dei use dichiarazioni si riferiscono a uno spazio dei nomi o di classe che si desidera accorciare:

use My\Full\Namespace; 

è equivalente a:

use My\Full\Namespace as Namespace; 
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo 

Se l'operatore use viene utilizzato con un nome di classe o interfaccia, è i seguenti usi:

// after this, "new DifferentName();" would instantiate a My\Full\Classname 
use My\Full\Classname as DifferentName; 

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent 
use ArrayObject; 

L'operatore use è da non confondere con autoloading. Una classe viene caricata automaticamente (annullando la necessità di include) registrando un autoloader (ad esempio con spl_autoload_register). Si potrebbe voler leggere PSR-4 per vedere un'implementazione del caricatore automatico adatta.

+0

Impressionante, lo controllo. Grazie! –

+0

Quindi, se creo un altro file chiamato bootstrap.php e inserisco un autoloader insieme a $ circle = new Circle(); Include il Circle.php ma sto ricevendo un errore: Errore irreversibile: Classe 'Shape' non trovata in .../Circle.php sulla riga 6. Sembra caricare Circle.php ma non caricare Shape.php Il cerchio è definito come: class Circle estende Shape implementa ShapeInterface –

+0

Se rimuovo lo spazio dei nomi dalle classi precedenti il ​​caricatore automatico funziona correttamente. Tuttavia quando ho spazio dei nomi nell'interfaccia della classe di forma ottengo l'errore di cui sopra –

4

Il modo più semplice per dirla

Se è necessario ordinare il codice a spazi dei nomi, basta usare la parola chiave namespace.

In file1.php namespace foo\bar;

In file2.php $obj = new foo\bar\myObj();


Ancora un po 'di più a questa storia - la parola chiave use.

Se nel file2 use foo\bar as mypath si dice che è necessario utilizzare mypath anziché foo\bar in qualsiasi punto del file. "

$obj = new mypath\myObj(); 

Se aveva detto use foo\bar è uguale a use foo\bar as bar