web-dev-qa-db-fra.com

PHP espaces de noms et "utilisation"

J'ai un petit problème avec les espaces de noms et les déclarations use.

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

J'essaie de faire cela en utilisant des chemins relatifs, donc je l'ai mis dans toutes les classes:

namespace Shape; 

Dans ma classe de cercle, j'ai les éléments suivants:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Si j'utilise les instructions include, je ne reçois aucune erreur. Si j'essaie les instructions use, je reçois:

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

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

106
Shawn Northrop

L'opérateur use) permet de donner des alias aux noms de classes, d'interfaces ou d'autres espaces de noms. La plupart des instructions use 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'opérateur use 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'opérateur use ne doit pas être confondu avec 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 de l'autoloader.

157
cmbuckley

Si vous devez commander votre code dans des espaces de noms, utilisez simplement le mot-clé namespace:

fichier1.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 mypath au lieu de bar n'importe où dans le fichier:

$obj  = new mypath\myObj();

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

10
Charlie