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?
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.
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;
.