2012-01-15 15 views
14

Pobieram framework i kod i mam pytanie dotyczące require i include vs class_exists.Zrozumienie klasy wymagane i istnieje

W kodzie pobrać widzę:

require_once('class.php'); 

jak również:

if(class_exists('class') == false) { require('class.php'); } 

uzyskać require_once oznacza tylko 1 raz i sprawdzić, czy istnieje klasa istnieje klasa.

Moje pytanie brzmi: czy drugie jest lepsze od pierwszego? i dlaczego?

+0

Właściwie bardzo interesująca perspektywa, jestem zaskoczony, że nigdy wcześniej nie widziałem drugiego zastosowania. – esqew

+1

Warto wspomnieć, że istnieją lepsze sposoby obecnie http://php.net/spl-autoload-register – KingCrunch

+2

Zgaduję, że każdy plik reprezentuje jedną i tylko jedną klasę? Nie masz wielu zajęć na plik? –

Odpowiedz

9

ten warunek:

if(class_exists('class') == false) { require('class.php'); } 

zapobiec require_once nazywać.

require_once może być powolny, jeśli masz dużo plików uwzględnionych w projekcie (szczególnie w frameworkach), ponieważ muszą zeskanować kod, aby upewnić się, że plik nie jest uwzględniony dwukrotnie lub więcej. więc jeśli masz ponad 25 plików, które dołączasz i są zagnieżdżone, require_once będzie musiał je wszystkie sprawdzić.

1

Drugi zapewnia większą ochronę przed importowaniem klasy dwukrotnie. Pierwszy importuje plik klasy jeden raz, ale jeśli klasa została zaimportowana z innego pliku z jakiegoś powodu, druga pokaże, że klasa została już zadeklarowana wcześniej i nie wymaga pliku klasy.

+0

uwaga: dwie klasy o tej samej nazwie prawie zawsze są złym pomysłem, więc jeśli nie robisz czegoś szalonego, 'require_once' powinno być w porządku. –

1
  • require_once() tylko include s a plik raz.

  • class_exists() sprawdza, czy istnieje Twoja klasa.

Można zdefiniować klasę w wielu plikach i require_once() nie obchodzi. Twoja druga porcja będzie.

5

Jak wspomniano w innych odpowiedziach, istnieją różnice semantyczne między tymi dwoma wariantami. Również w scenariuszu współdzielonego hostingu, w którym dostawca hostingu nie oferuje buforowania kodu Opcode PHP (APC lub równoważnika), wszystkie pliki kodu należy odczytywać i kompilować raz na żądanie. Tutaj głównym zabójcą nie jest sam czas kompilacji (~ 0.5M instrukcji PHP/s na nowoczesnym rdzeniu), ale nakład pracy związany z I/O zbierania plików PHP, jeśli nie jest wstępnie buforowany w pamięci podręcznej systemu plików (10s z I/Os/s).

W tym scenariuszu, jeśli aplikacja wymaga rdzenia kilkunastu modułów dla 90% zapytań, sensowne jest buforowanie ich w jeden plik bulkload. Jeśli ten typ rozwiązania zostanie przyjęty, umieszczenie wartownika wokół wymaganego pliku klasy spowoduje, że będzie on odporny na bomby.

Również uwaga: W przypadku korzystania z funkcji __autoload() zrobić klasy JiT załadunek, należy pamiętać, że class_exists('fred')będzie wywołać AutoLoad z fred. Jeśli chcesz mieć słabą sondę, musisz zamiast tego użyć predykatu !in_array('fred', get_declared_classes()).