132 votes

Espaces de noms PHP et "utilisation

J'ai un peu de mal avec les espaces de noms et l'option use déclarations.

J'ai trois dossiers : ShapeInterface.php , Shape.php y Circle.php .

J'essaie d'utiliser des chemins d'accès relatifs et j'ai donc ajouté cela dans toutes les classes :

namespace Shape; 

Dans ma classe circulaire, 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 le include Je n'obtiens aucune erreur. Si j'essaie l'instruction use Je reçois des déclarations :

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

Quelqu'un pourrait-il m'aider à résoudre ce problème ?

190voto

cbuckley Points 10401

Les use opérateur sert à donner des alias aux noms de classes, d'interfaces ou d'autres espaces de noms. La plupart des 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 le 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;

Les use ne doit pas être confondu avec chargement automatique . Une classe est chargée automatiquement (sans qu'il soit nécessaire d'utiliser la fonction include ) en enregistrant un autoloader (par exemple avec spl_autoload_register ). Vous pouvez lire PSR-4 pour voir une implémentation appropriée de l'autochargeur.

16voto

Charlie H Points 2538

Si vous devez classer votre code dans des espaces de noms, il vous suffit d'utiliser le mot-clé namespace :

file1.php

namespace foo\bar;

Dans file2.php

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

Vous pouvez également utiliser use . Si dans le fichier 2 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();

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X