Spazi dei nomi PHP e "utilizzo"


120

Ho un piccolo problema con gli spazi dei nomi e le usedichiarazioni.

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

Sto cercando di farlo utilizzando percorsi relativi, quindi l'ho inserito in tutte le classi:

namespace Shape; 

Nella mia classe cerchia ho quanto segue:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Se uso le includedichiarazioni non ottengo errori. Se provo le useaffermazioni che ottengo:

Errore irreversibile: classe "Shape \ Shape" non trovata in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php alla riga 8

Qualcuno potrebbe darmi una piccola guida sulla questione?


Anche riguardo a questo argomento - stackoverflow.com/questions/33341955/…
Peter

Risposte:


169

L' useoperatore serve per fornire alias ai nomi di classi, interfacce o altri spazi dei nomi. La maggior parte delle useistruzioni fa riferimento a uno spazio dei nomi o una classe che desideri abbreviare:

use My\Full\Namespace;

è equivalente a:

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

Se l' useoperatore viene utilizzato con un nome di classe o interfaccia, ha i seguenti utilizzi:

// 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' useoperatore non deve essere confuso con il caricamento automatico . Una classe viene caricata automaticamente (annullando la necessità di include) registrando un caricatore automatico (ad esempio con spl_autoload_register). Potresti voler leggere PSR-4 per vedere un'implementazione adatta del caricatore automatico.


Quindi, se creo un altro file chiamato bootstrap.php e inserisco un autoloader all'interno insieme a $ circle = new Circle (); Include Circle.php ma ricevo un errore: Errore irreversibile: Classe 'Shape' non trovata in ... / Circle.php alla riga 6. Sembra caricare Circle.php ma non caricare Shape.php Circle è definito come: classe Circle estende Shape implementa ShapeInterface
Shawn Northrop

Se rimuovo lo spazio dei nomi dalle classi sopra, il caricatore automatico funziona correttamente. Tuttavia, quando ho lo spazio dei nomi nell'interfaccia della classe di forme ottengo l'errore precedente
Shawn Northrop,

1
Creato una sintesi per fare un esempio. Purtroppo le sintesi non possono avere sottocartelle. Metti il ​​bootstrap.php in una cartella e metti le altre classi in una sottocartella chiamata "Shape".
cmbuckley

13

Se devi ordinare il tuo codice in spazi dei nomi, usa semplicemente la parola chiave namespace:

file1.php

namespace foo\bar;

In file2.php

$obj = new \foo\bar\myObj();

Puoi anche usare use. Se in file2 metti

use foo\bar as mypath;

devi usare mypathinvece che barovunque nel file:

$obj  = new mypath\myObj();

L'utilizzo use foo\bar;è uguale a use foo\bar as bar;.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.