Espaces de noms PHP et «utilisation»

120

J'ai un peu de mal avec les espaces de noms et les usedéclarations.

J'ai trois fichiers: ShapeInterface.php, Shape.phpet Circle.php.

J'essaie de le faire en utilisant des chemins relatifs, donc j'ai mis ceci dans toutes les classes:

namespace Shape; 

Dans ma classe de cercle, j'ai ce qui suit:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Si j'utilise les includedéclarations, je n'obtiens aucune erreur. Si j'essaye les usedéclarations que j'obtiens:

Erreur fatale: classe 'Shape \ Shape' introuvable dans /Users/shawn/Documents/work/sites/workspace/shape/Circle.php sur la ligne 8

Quelqu'un pourrait-il s'il vous plaît me donner quelques conseils sur la question?

Shawn Northrop
la source
A ce sujet également - stackoverflow.com/questions/33341955/…
Peter

Réponses:

169

L' useopérateur sert à donner des alias aux noms de classes, d'interfaces ou d'autres espaces de noms. La plupart des useinstructions font référence à un espace de noms ou à une classe que vous souhaitez raccourcir:

use My\Full\Namespace;

est équivalent à:

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

Si l' useopérateur est utilisé avec un nom de classe ou d'interface, il a les utilisations suivantes:

// 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' useopérateur ne doit pas être confondu avec le chargement automatique . Une classe est chargée automatiquement (annulant le besoin de include) en enregistrant un chargeur automatique (par exemple avec spl_autoload_register). Vous voudrez peut-être lire PSR-4 pour voir une implémentation appropriée du chargeur automatique.

cmbuckley
la source
Donc, si je crée un autre fichier appelé bootstrap.php et place un chargeur automatique à l'intérieur avec $ circle = new Circle (); Il inclut le Circle.php mais j'obtiens une erreur: Erreur fatale: Classe 'Shape' introuvable dans ... / Circle.php sur la ligne 6. Il semble charger Circle.php mais pas charger Shape.php Circle est défini comme: classe Circle s'étend Shape implements ShapeInterface
Shawn Northrop
Si je supprime l'espace de noms des classes ci-dessus, le chargeur automatique fonctionne correctement. Cependant, lorsque j'ai un espace de noms dans l'interface de la classe de forme, j'obtiens l'erreur ci-dessus
Shawn Northrop
1
Créé un résumé pour donner un exemple. Malheureusement, les gists ne peuvent pas avoir de sous-dossiers. Mettez bootstrap.php dans un dossier et placez les autres classes dans un sous-dossier nommé 'Shape'.
cmbuckley
13

Si vous avez besoin de classer votre code dans des espaces de noms, utilisez simplement le mot-clé namespace:

file1.php

namespace foo\bar;

Dans file2.php

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

Vous pouvez également utiliser use. Si dans file2 vous mettez

use foo\bar as mypath;

vous devez utiliser mypathau lieu de barn'importe où dans le fichier:

$obj  = new mypath\myObj();

Utiliser use foo\bar;est égal à use foo\bar as bar;.

Charlie
la source