Eksperymentowałem z technikami mapowania katalogu klasy autoloadera, i to było trochę walki. Udało mi się znaleźć dość proste rozwiązanie (na powierzchni), ale jestem całkowicie zaskoczony, że działa w ogóle, podczas gdy inne "bardziej oczywiste" rozwiązania zawiodły. Poniżej znajduje się kilka fragmentów kodu, które ilustrują moje zamieszanie.autoloader php: dlaczego to działa?
Oto kod roboczych:
<?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;
}
}
}
?>
Oto urywek że czułem powinien pracy, ale nie:
<?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');
}
}
}
?>
Ten ostatni ma większy sens dla mnie, bo gdy te dwa wersje działają:
<?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');
}
?>
Ten jeden wyrzuca "Brak takiego pliku lub katalogu ..." (zwróć uwagę na brak "sites /" w ścieżce.
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
„nie ma takiego pliku lub katalogu ...” Błąd uświadomiła mi, że mogę po prostu sprawdzić plik nośnej klasy i, jeśli (file_exists()) {require_once(); break;} else {continue;}
Dlaczego to nie działa? I dlaczego działa pierwszy snippet? Ścieżka/plik pomocniczy nigdy nie jest wyraźnie zawarty ani wymagany.
to katalog nadrzędny ścieżki klas w twoich ścieżkach include_paths? – Orangepill
Dołączony jest plik pomocniczy, jest on połączony z instrukcją if: if (! @include_once ($ location. $ Class. '.php')) –
Tak, myślałem o tym, john500, ale liczyłem na potwierdzenie , dzięki za to. Czuję się jak bardzo niechlujny sposób, aby osiągnąć to, czego potrzebuję, więc to po prostu podrażnia moją świnkę, by ulepszyć rozwiązanie. Orangepill, nie jestem pewien, jak to zrobić ... Nie pracowałem z PHP przez jakiś czas, a kiedy ostatnio to zrobiłem, nie byłem w połowie tak dobry w programowaniu jak teraz ... więc "Zasadniczo hackowanie w PHP próbuje robić rzeczy, które już wiem jak robić w Javie i ColdFusion;). –