2012-05-10 5 views
82

J'ai un petit problème avec les espaces de noms et les instructions use. J'ai trois fichiers: ShapeInterface.php, Shape.php et Circle.php.namespaces PHP et "utiliser"

Je suis en train de le faire en utilisant des chemins relatifs donc j'ai mis cela dans toutes les classes:

namespace Shape; 

Dans ma classe de cercle, je donne les résultats suivants:

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

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

class Circle extends Shape implements ShapeInterface{ .... 

Si je les instructions include je ne reçois aucune erreur. Si je tente les use déclarations que je reçois:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

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

+0

je lis cela et ne comprends toujours pas bien. Les fichiers externes seront-ils inclus avec l'utilisation? –

+0

Également sur ce sujet - http: // stackoverflow.com/questions/33341955/does-the-import-or-use-order-affect-fonctionnalité-in-php – Peter

Répondre

124

Le use operator sert à donner des alias aux noms de classes, interfaces ou autres espaces de noms. La plupart des use déclarations se rapportent à un espace de noms ou de 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 de l'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 est à ne pas confondre avec autoloading. Une classe est chargée automatiquement (en supprimant le besoin de include) en enregistrant un autochargeur (par exemple avec spl_autoload_register). Vous voudrez peut-être lire PSR-4 pour voir une implémentation d'autochargeur appropriée.

+0

Génial, Ill vérifier cela. Merci! –

+0

Donc, si je crée un autre fichier appelé bootstrap.php et placez un autochargeur à l'intérieur avec $ circle = new Circle(); Il inclut le Circle.php mais j'obtiens une erreur: Erreur fatale: Classe 'Shape' non trouvé dans .../Circle.php sur la ligne 6. Il semble charger Circle.php mais pas charger Shape.php Le cercle est défini as: class Circle extends Shape implémente ShapeInterface –

+0

Si je supprime l'espace de noms des classes ci-dessus, l'autochargeur fonctionne correctement. Cependant, quand j'ai l'espace de noms dans l'interface de la classe de forme, j'obtiens l'erreur ci-dessus –

4

La façon la plus simple de le mettre

Si vous devez commander votre code dans les espaces de noms, il suffit d'utiliser le mot-clé namespace.

Dans file1.php namespace foo\bar;

Dans file2.php $obj = new foo\bar\myObj();


Encore un peu plus à cette histoire - le mot-clé use.

Si vous dites dans le fichier 2 use foo\bar as mypath cela signifie que vous devez utiliser mypath au lieu de foo\bar n'importe où dans le fichier.

$obj = new mypath\myObj(); 

Si vous aviez dit use foo\bar il est égal à use foo\bar as bar