Ich experimentierte mit Autoloader Klassenverzeichnis Mapping-Techniken, und es war ein bisschen ein Kampf. Es gelang mir, eine ziemlich einfache Lösung (oberflächlich) zu finden, aber ich bin völlig verwirrt, dass es überhaupt funktioniert, während andere, "offensichtlicher" Lösungen versagten. Im Folgenden finden Sie einige Codefragmente, die meine Verwirrung verdeutlichen.php autoloader: warum funktioniert das?
Hier ist der Arbeitscode:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if ([email protected]_once($location . $class . '.php')) { // @ SUPPRESSES include_once WARNINGS
// CLASS DOESN'T EXIST IN THIS DIRECTORY
continue;
} else {
// CLASS IS AUTO-LOADED
break;
}
}
}
?>
Hier ist ein Ausschnitt, den ich sollte Arbeit gefühlt, aber nicht:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (file_exists($location . $class . '.php')) {
require_once ($location . $class . '.php');
}
}
}
?>
Letzteres mehr Sinn für mich macht, denn während diese beiden Versionen funktionieren:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/sites/' . $class . '.php');
}
?>
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$location = 'classes/sites/';
require_once ($location . $class . '.php');
}
?>
Dieser wirft "Keine solche Datei oder Verzeichnis ..." (Beachten Sie das Fehlen von "Sites /" im Pfad.
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
Die „Keine solche Datei oder das Verzeichnis ...“ Fehler hat mich glaube ich einfach für eine Klasse unterstützt Datei überprüfen konnte, und wenn (file_exists()) {require_once(); break;} else {continue;}
Warum funktioniert das nicht? Und warum funktioniert das erste Snippet? Der unterstützende Pfad/die Datei ist niemals explizit enthalten oder erforderlich.
ist das übergeordnete Verzeichnis der Klassen Pfad in Ihrem include_paths? – Orangepill
Die unterstützende Datei ist enthalten, es wird nur in der if-Anweisung kombiniert: if (! @include_once ($ location. $ Class. '.php')) –
Ja, ich dachte das, John500, aber hoffte auf Bestätigung Also vielen Dank dafür. Es fühlt sich an, als wäre ich ein sehr schlampiger Weg, um das zu erreichen, was ich brauche, aber das verdirbt nur meinen Juckreiz, um die Lösung zu verbessern. Orangepill, ich bin mir nicht sicher, wie ich das machen soll ... Ich habe seit einiger Zeit nicht mehr mit PHP gearbeitet, und als ich das letzte Mal getan habe, war ich nicht mehr so gut programmiert wie jetzt ... also ich Ich hack 'im Grunde bei PHP und versuche Dinge zu tun, die ich bereits in Java und ColdFusion zu tun weiß;). –