Ich erhalte diese Fehlermeldung, wenn ich versuche, Autoload und Namespaces zu verwenden:
Schwerwiegender Fehler: Klasse 'Klasse1' nicht in /usr/local/www/apache22/data/public/php5.3/test.php in Zeile 10 gefunden
Kann mir jemand sagen, was ich falsch mache?
Hier ist mein Code:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
AS
. Deshalb funktioniert diese Lösung nicht. Sie könnten genauso gut tun:use Person\Barnes\David\Class1;
(was gleichbedeutend ist mituse Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
um zu tun$class = new Class1();
. Mituse Person\Barnes\David;
muss man machen$class = new David\Class1();
. Dasuse
Schlüsselwort für sich entsprichtuse Person\Barnes\David\Class1 as Class1;
bzw. entsprichtuse Person\Barnes\David as David;
jedem Beispiel.Wie Pascal MARTIN erwähnt, sollten Sie das '\' durch DIRECTORY_SEPARATOR ersetzen, zum Beispiel:
Ich würde Ihnen auch empfehlen, die Verzeichnisstruktur neu zu organisieren, um den Code besser lesbar zu machen. Dies könnte eine Alternative sein:
Verzeichnisaufbau:
Datei:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Datei:
/ProjectRoot/test.php
quelle
Ihre
__autoload
Funktion erhält den vollständigen Klassennamen einschließlich des Namespace-Namens.Dies bedeutet in Ihrem Fall, dass die
__autoload
Funktion 'Person\Barnes\David\Class1
' und nicht nur 'Class1
' erhält .Sie müssen also Ihren Autoloading-Code ändern, um mit dieser Art von "komplizierterem" Namen fertig zu werden. Eine häufig verwendete Lösung besteht darin, Ihre Dateien mit einer Verzeichnisebene pro "Ebene" von Namespaces zu organisieren und beim automatischen Laden '
\
' im Namespace-Namen durch zu ersetzenDIRECTORY_SEPARATOR
.quelle
__autoload
Funktion erhält den vollständigen Klassennamen einschließlich des Namespace-Namens" - dies gilt nur, wenn Sie explizituse
die Klasse angegeben haben, auf die Sie verweisen möchten , und nicht, wenn Sie lediglichuse
den Namespace angegeben haben, zu dem sie gehört. Der Fehler des OP war, dass eruse
den Namespace mit einer Klasse erstellt hatte und dann erwartete, dass seine Autoload-Funktion auf magische Weise den vollständigen Klassenpfad passieren würde. Diese Antwort spricht den Fehler des OP nicht wirklich an.Ich mache so etwas: Siehe dieses GitHub-Beispiel
quelle
Ich habe dieses Juwel von Flysystem gefunden
quelle
Ich sehe, dass die Autoload-Funktionen in den folgenden beiden Fällen nur den "vollständigen" Klassennamen erhalten - mit allen vorangegangenen Namespaces:
Ich sehe, dass die Autoload-Funktionen im folgenden Fall NICHT den vollständigen Klassennamen erhalten:
UPDATE: [c] ist ein Fehler und funktioniert sowieso nicht mit Namespaces. Ich kann berichten, dass anstelle von [c] auch die folgenden zwei Fälle gut funktionieren:
Hoffe das hilft.
quelle
use
Schlüsselwort funktioniert in der interaktiven PHP-Befehlszeilenschnittstelle (php --interactive
) nicht richtig .Ich benutze diesen einfachen Hack in einer Zeile:
quelle
hatte das gleiche Problem und fand gerade Folgendes:
Wenn Sie eine Unterordnerstruktur erstellen, die mit den Namespaces der enthaltenen Klassen übereinstimmt, müssen Sie nicht einmal einen Autoloader definieren.
Es funktionierte wie ein Zauber
Weitere Informationen hier: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
BEARBEITEN: Dies verursacht unter Linux ein Problem aufgrund eines Backslashs ... Hier finden Sie eine funktionierende Lösung von immeëmosol
Namespace Autoload funktioniert unter Windows, jedoch nicht unter Linux
quelle
Die Verwendung von gotcha ist zwar bei weitem die schnellste Methode, es wird jedoch auch erwartet, dass alle Dateinamen in Kleinbuchstaben geschrieben werden.
Beispielsweise:
Eine Datei, die die Klasse SomeSuperClass enthält, muss somesuperclass.php heißen. Dies ist ein Problem, wenn Sie ein Dateisystem mit Groß- und Kleinschreibung wie Linux verwenden, wenn Ihre Datei SomeSuperClass.php heißt, aber unter Windows kein Problem darstellt.
Die Verwendung von __autoload in Ihrem Code funktioniert möglicherweise weiterhin mit aktuellen PHP-Versionen. Erwarten Sie jedoch, dass diese Funktion in Zukunft veraltet und endgültig entfernt wird.
Also, welche Optionen bleiben übrig:
Diese Version funktioniert mit PHP 5.3 und höher und ermöglicht die Dateinamen SomeSuperClass.php und somesuperclass.php. Wenn Sie 5.3.2 und höher verwenden, arbeitet dieser Autoloader noch schneller.
quelle
str_replace ([ '_','\\'] '/', $className );
ist doppelt so schnell wie zwei str_replaceIch fand kürzlich Tanerkucs Antwort sehr hilfreich! Ich wollte das nur mit hinzufügen
strrpos()
+substr()
etwas schneller ist alsexplode()
+end()
:quelle
Ich werde meine zwei Cent für relative Anfänger oder was auch immer ein einfaches spl_autoload_register () Setup ohne die ganze Theorie wollen einwerfen: Erstellen Sie einfach eine PHP-Datei für jede Klasse, benennen Sie diese PHP-Datei mit Ihrem Klassennamen und behalten Sie Ihre Klassendateien im selben Verzeichnis wie Ihre betreffende PHP-Datei, dann funktioniert dies:
Das Googeln der Teile in dieser Funktion sollte die Funktionsweise beantworten. PS: Ich benutze Linux und das funktioniert unter Linux. Windows-Leute sollten es zuerst testen.
quelle
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Sie möchten Ihre Klassendateien in einem Ordner namens Classes ablegen, der sich im selben Verzeichnis befindet wie der Einstiegspunkt in Ihre PHP-Anwendung. Wenn Klassen Namespaces verwenden, werden die Namespaces in die Verzeichnisstruktur konvertiert. Im Gegensatz zu vielen anderen Auto-Loadern werden Unterstriche nicht in Verzeichnisstrukturen konvertiert (es ist schwierig, PHP <5.3 Pseudo-Namespaces zusammen mit PHP> = 5.3 echte Namespaces zu erstellen).
Sie möchten den folgenden Code in Ihr Haupt-PHP-Skript (Einstiegspunkt) einfügen:
Hier ist ein Beispiel für ein Verzeichnislayout:
quelle
quelle