2011-12-13 18 views
15

Do tego momentu użyłem proceduralnych autonomicznych funkcji autoloadera i zarejestrowałem je za pomocą spl_autoload_register(), aby automatycznie ładować moje (zazwyczaj) klasy z przypisanymi nazwami. Ostatnio jednak zauważyłem, że ludzie wspominali o stosowaniu klas autoloadera w połączeniu z niektórymi z czołowych frameworków PHP.Funkcja autoloadera PHP vs. funkcja autoloadera proceduralnego?

Prawie cały mój kod jest zorientowany obiektowo w dzisiejszych czasach, ale tak naprawdę nie widzę zalet korzystania z klasy "Autoloader" zamiast podstawowej funkcji w tym przypadku. Jeśli chodzi o testowalność, czuję się całkiem nieźle jeśli chodzi o sprawdzanie w testach testów class_exists(), aby sprawdzić, czy funkcje proceduralne ładują pliki poprawnie.

więc moje pytania są trzy:

  1. Jakie zalety i funkcje (jeśli w ogóle) może kołysać mnie byłaby rzeczy i zacząć używać pełnowartościowy obiekt do plików klasowych autoload?
  2. Czy brakuje tu pewnych rażących zalet poza oczywistymi funkcjami OOP?
  3. Czy możesz poprosić o autoloader proceduralny lub klasyczny?

UPDATE

Poniżej jest jakiś kod przykładem typowej funkcji autoload mogę zatrudnić. Jest to metakod, więc nie szukaj literówek. Organizuję struktury katalogów tak, aby odzwierciedlały przestrzenie nazw. Hipotetyczna funkcja explode_namespaces() może być teoretycznie włączona jako metoda statyczna obok metody statycznej w klasie, więc jest to jedna z korzyści. Może być czystsze łączenie tych różnych funkcji "narzędziowych" jako metod w jednej klasie.

function autoload($class_name) 
{ 
    $root = APP_LIBS; // a directory path constant set at config time 

    if ($namespaces = explode_namespaces($class_name)) { 

    $domain = array_shift($namespaces); 
    $root .= "/$domain/"; 

    $class_name = array_pop($namespaces); 
    $directories = array(); 

    foreach ($namespaces as $directory) { 
     $directories[] = $directory; 
    } 
    $root .= implode($directories, '/'); 
    } 

    $file = "$root/$class_name.php"; 
    if (file_exists($file)) { 
    include $file; 
    } 
} 
+0

Usunąłem część "odpowiedź" z twojego pytania, ponieważ nie ma to znaczenia dla pytania. Powinieneś rozważyć dodanie własnej odpowiedzi, to prawdopodobnie pomoże innym :) – James

Odpowiedz

4

Porównywa się funkcje z metodami. To tylko cukier syntaktyczny.

Jeśli nie masz automatycznego mechanizmu ładującego opartego na mapach lub takiego, który ma wbudowaną tabelę zależności, nie potrzebujesz żadnych atrybutów na poziomie klasy, aby śledzić rzeczy (lub w inny sposób można się odwoływać do zmiennych statycznych lub globalnych). Możliwości rekonfiguracji w czasie pracy również nie są rzeczywistą koniecznością.

Możesz skonfigurować projekt proceduralny automatyczny ładujący za pomocą stałych itp. Posiadanie właściwości konstruktora nie ma tak dużego znaczenia dla ponownego wykorzystania przy implementacji metody. Może tylko wyglądać nieco ładniej.

0

Użyj wstępnie zbudowanego, jeśli już używasz innej głównej części ramy, w przeciwnym razie nie ma to znaczenia.

Ponadto, użycie jednego automatycznego programu ładującego, z wieloma rejestrowanymi przestrzeniami/katalogami zmniejszy nieco pamięć, ale to nie jest problem.

+0

Dzięki za odpowiedź. Nie używam tych frameworków. Generalnie wolę wiśnia wybrać moje ulubione funkcje z różnych frameworków i nie mam ochoty na dyskusję "Powinieneś używać ramek". Ponadto używam tylko jednego autoloadera. O tym, jak zaktualizować pytanie za pomocą przykładowego kodu . – rdlowrey