PHP-Namespaces und "use"

120

Ich habe ein kleines Problem mit Namespaces und den useAnweisungen.

Ich habe drei Dateien: ShapeInterface.php, Shape.phpund Circle.php.

Ich versuche dies über relative Pfade zu tun, daher habe ich dies in alle Klassen eingefügt:

namespace Shape; 

In meiner Kreisklasse habe ich folgendes:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Wenn ich die includeAnweisungen verwende, erhalte ich keine Fehler. Wenn ich die useAussagen versuche, bekomme ich:

Schwerwiegender Fehler: Die Klasse 'Shape \ Shape' wurde in Zeile 8 in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php nicht gefunden

Könnte mir bitte jemand eine kleine Anleitung zu diesem Thema geben?

Shawn Northrop
quelle
Auch zu diesem Thema - stackoverflow.com/questions/33341955/…
Peter

Antworten:

169

Der useOperator dient zum Vergeben von Aliasnamen für Namen von Klassen, Schnittstellen oder anderen Namespaces. Die meisten useAnweisungen beziehen sich auf einen Namespace oder eine Klasse, die Sie kürzen möchten:

use My\Full\Namespace;

ist äquivalent zu:

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

Wenn der useOperator mit einem Klassen- oder Schnittstellennamen verwendet wird, hat er folgende Verwendungszwecke:

// 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;

Der useBediener ist nicht mit dem automatischen Laden zu verwechseln . Eine Klasse wird automatisch geladen (ohne dass dies erforderlich ist include), indem ein Autoloader registriert wird (z spl_autoload_register. B. mit ). Vielleicht möchten Sie PSR-4 lesen , um eine geeignete Autoloader-Implementierung zu sehen.

cmbuckley
quelle
Wenn ich also eine andere Datei namens bootstrap.php erstelle und einen Autoloader zusammen mit $ circle = new Circle () darin platziere; Es enthält die Circle.php, aber ich erhalte eine Fehlermeldung: Schwerwiegender Fehler: Klasse 'Shape' nicht in ... / Circle.php in Zeile 6 gefunden. Es scheint, Circle.php zu laden, aber Shape.php nicht zu laden. Circle ist definiert as: class Circle erweitert Shape implementiert ShapeInterface
Shawn Northrop
Wenn ich den Namespace aus den oben genannten Klassen entferne, funktioniert der Autoloader einwandfrei. Wenn ich jedoch einen Namespace in der Schnittstelle der Formklasse habe, erhalte ich den obigen Fehler
Shawn Northrop
1
Erstellt einen Kern , um ein Beispiel zu geben. Leider können Gists keine Unterordner haben. Legen Sie die Datei bootstrap.php in einem Ordner ab und legen Sie die anderen Klassen in einem Unterordner mit dem Namen 'Shape' ab.
cmbuckley
13

Wenn Sie Ihren Code in Namespaces bestellen müssen, verwenden Sie einfach das Schlüsselwort namespace:

file1.php

namespace foo\bar;

In file2.php

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

Sie können auch verwenden use. Wenn in Datei2 Sie setzen

use foo\bar as mypath;

Sie müssen mypathanstelle einer barbeliebigen Stelle in der Datei Folgendes verwenden:

$obj  = new mypath\myObj();

Verwenden use foo\bar;ist gleich use foo\bar as bar;.

Charlie
quelle