Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

> Włączanie plików + autoloader, chętnie bym posłuchał ciekawych pomysłów
hawk
post 10.02.2005, 17:23:52
Post #1





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Problem stary jak świat: system wymaga włączenia sporej liczby plików i zarządzanie tym jest upierdliwe. Do tego nie należy włączać więcej kodu niż potrzeba, a najlepiej zrobić jakieś lazy load.

Oczywiście, technik jest wiele:

1) require_once rozsiane po plikach, najlepiej poprzedzone jakąś stałą, np. require_once ROOT_DIR . '/foo/Foo.class.php';

2) Prado: deklarujemy namespacy - np. za pomocą funkcji using(), co dodaje nam ścieżki do include_path, a potem niech php znajdzie klasę.

3) Autoloader + mapa (nazwa klasy => ścieżka do pliku); autoloader wczytuje mapę i na jej podstawie jest w stanie znaleźć każdą klasę

Są jeszcze jakieś inteligentne sposoby? Dobry mechanizm powinien być odporny na "przemeblowanie" struktury plików (np. chcemy połączyć kilka klas w jeden plik).

BTW, włączanie plików bez klas (tylko funkcje i kod) jest gorsze, bo nie ma tego czegoś, czego można szukać po plikach... kolejna zaleta OOP? winksmiley.jpg
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bela
post 26.02.2005, 12:21:14
Post #2


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

Ostrzeżenie: (0%)
-----


Cytat(hawk @ 2005-02-26 09:55:15)
@bela_666: pokaż pokaż pokaż tongue.gif

Heh, ale to dopiero brzydko wyglądający prototyp, ale ok biggrin.gif Pisałem, aby w ogóle działało winksmiley.jpg

  1. <?php
  2. error_reporting(E_ALL|E_STRICT);
  3. function get_microtime() {
  4. list($usec, $sec) = explode(&#092;" \",microtime());
  5. return ((float)$usec + (float)$sec);
  6. }
  7.  
  8. global $fileContext;
  9. $fileContext = array();
  10. $start = get_microtime();
  11. iterateDir('.'/*dirname(__FILE__)*/);
  12.  
  13. function iterateDir($path) {
  14. $di = new DirectoryIterator($path);
  15. foreach ($di as $k => $v) {
  16. // get extension
  17. $ext = end(explode('.', $v->getPathname()));
  18. // is svn dir
  19. $name = $v->getFilename();
  20. $first = substr($name, 0, 1);
  21. $first == '.' ? $dupa = false : $dupa = true;
  22.  
  23. // if is dir and not svn dir, iterate this dir;]
  24. if($v->isDir() && $dupa) {
  25. iterateDir($v->getPath() . '/' . $v->getFilename());
  26. }
  27. // print filename with path, with php extenstion
  28. if($dupa && $v->isFile() && $ext == 'php' && $v->getFilename() != 'tokenizer.php' && $v->getFilename() != 'test.php' && $v->getFilename() != 'config.php' && $v->getFilename() != 'dupa.php') {
  29. $GLOBALS['fileContext'][] = array($v->getPathname(), token_get_all(file_get_contents($v->getPathname())));
  30. //print $v->getPathname() . \"<br />n\";
  31. }
  32. }
  33.  
  34. }
  35.  
  36. //dump($fileContext);
  37. $classes = array();
  38. $key = 0;
  39. foreach($fileContext as $file) {
  40. static $i;
  41. foreach ($file as $c) {
  42. if(is_array($c)) {
  43. $a = false;
  44. foreach ($c as $k => $v) {
  45. if(is_array($v)) {
  46. if($v[0] == T_CLASS || $v[0] == T_INTERFACE) {
  47. $a = true;
  48. } elseif ($a && $v[0] == T_STRING) {
  49. $classes[] = array($v[1], substr($file[0], 2));
  50. $a = false;
  51. }
  52. }
  53. else
  54. {
  55. //print(\"$v<br/>n\");
  56. }
  57. }
  58. }
  59.  
  60. }
  61.  
  62. }
  63.  
  64. //dump($classes);
  65.  
  66. $phpCode = '<?php function __autoload($name) {' . &#092;"n\";
  67. $phpCode .= 'static $map = array(' . &#092;"n\";
  68. foreach ($classes as $k => $v) {
  69. $phpCode .= ''' . $v[0] . '' => '' . $v[1] . '','. &#092;"n\";
  70. }
  71. $phpCode .= ');' . &#092;"n\";
  72. $phpCode .= 'require_once($map[$name]);' . &#092;"n}n\";
  73. $phpCode .= '?>';
  74. file_put_contents('autoload.php', $phpCode);
  75. //dump($fileContext);
  76. function dump($dump) {
  77. print('<pre>');
  78. var_dump($dump);
  79. print('</pre>');
  80. }
  81. print ($end = get_microtime() - $start . '<br />');
  82. ?>


--------------------
Go to the top of the page
+Quote Post

Posty w temacie
- hawk   Włączanie plików + autoloader   10.02.2005, 17:23:52
- - DeyV   Aby sprawę jeszcze bardziej skomplikować - warto p...   10.02.2005, 21:46:51
- - Imperior   Myślę, że moje rozwiązanie pomoże Ci, jeśli wpadni...   11.02.2005, 18:39:48
- - hawk   @Imperior: Dwie słabe strony tu widzę: 1) Wszyst...   18.02.2005, 14:39:33
- - bela_666   Ja mysle, zeby rozwiazac to na podobnej zasadzie j...   18.02.2005, 15:03:36
- - Imperior   Cytat(hawk @ 2005-02-18 13:39:33)Dwie słabe s...   18.02.2005, 20:17:07
- - hawk   @bela_666: Takie rozwiązanie na pewno pasuje do ja...   21.02.2005, 14:43:27
- - hawk   @serafin: Możesz napisać więcej? Mi się zawsze wyd...   25.02.2005, 09:23:01
- - Imperior   Cytat(hawk @ 2005-02-25 08:23:01)Bo problem z...   25.02.2005, 09:55:57
- - Vengeance   A co Wam się stanie gdy zamiast System.Out będzie ...   25.02.2005, 11:42:46
- - hawk   Nic się nie stanie, poza utratą estetyki . Chociaż...   25.02.2005, 12:06:36
- - Vengeance   ale to jest php a nie java Co do autoloadera... ...   25.02.2005, 12:31:22
- - hawk   Co za problem? Sprawdzanie po zrobieniu explode je...   25.02.2005, 12:48:42
- - Seth   Troche to stary kod ale moze sie przyda: [PHP] po...   25.02.2005, 12:50:43
- - bela_666   Seth, a czy te pregi nie spowalniają bardzo przy d...   25.02.2005, 12:55:30
- - Seth   Jakies spowolnienie napewno jest ale za to mozna l...   25.02.2005, 13:07:03
- - bela_666   Cytat(hawk)Podsumowując, idealnie chciałbym mieć: ...   26.02.2005, 00:02:23
- - Nievinny   Jeśli mogę wtrącić trzy grosze, ja myślę, że można...   26.02.2005, 09:35:42
- - hawk   @bela_666: pokaż pokaż pokaż   26.02.2005, 09:55:15
- - Vengeance   Nievinny: jakbyś zrobił cache jakiś to ok. Teraz u...   26.02.2005, 11:55:48
- - bela_666   Cytat(hawk @ 2005-02-26 09:55:15)@bela_666: p...   26.02.2005, 12:21:14
- - Vengeance   Połączyłem kody: bela_666, Nievinny oraz Imperiora...   26.02.2005, 12:36:56
- - Vengeance   Linia nr 9: zmieniasz ją na: Kod if(!i...   26.02.2005, 12:41:48
- - Nievinny   @Vengeance -> Czy twoim zdaniem ładowanie z map...   26.02.2005, 17:03:09
- - Vengeance   Nievinny: chodzi oto, aby mape generować tylko RAZ...   26.02.2005, 17:35:25
- - Nievinny   CytatNievinny: chodzi oto, aby mape generować tylk...   26.02.2005, 17:42:59
- - Vengeance   A po co foreach? Jeszcze opozniac ? To $map[...   26.02.2005, 18:15:03
- - hawk   @Vengeance et al: No, bardzo ładny kod . Ja bym do...   26.02.2005, 18:42:06
- - Vengeance   Ok userzy forum.php.pl "wymyslili" juz i...   26.02.2005, 19:07:38
- - Nievinny   Nazwa: Autoload Class System... może być, a klasa...   27.02.2005, 12:32:23
- - chmolu   Ja to rozwiązałem podobnie, jak w nowym Mojavi: [...   4.03.2005, 10:29:10
- - Nievinny   A ja generujesz listę klas? Tu masz od razu genera...   4.03.2005, 10:52:36
- - chmolu   Lista klas jest w pliku konfiguracyjnym autoload.i...   4.03.2005, 16:34:52
- - hawk   @chmolu: 1) Z tego co pamietam, w __autoload nie m...   4.03.2005, 17:26:32
- - chmolu   Cytat1) Z tego co pamietam, w __autoload nie mozna...   4.03.2005, 17:49:43
- - Nievinny   W sumie, skrypt po raz pierwszy zaczyna działanie ...   4.03.2005, 18:05:53
- - Imperior   Cytat(hawk @ 2005-03-04 16:26:32)1) Z tego co...   5.03.2005, 11:12:31
- - hawk   @chmolu: Faktycznie, obsługa plików ini jest bardz...   7.03.2005, 03:36:42
- - Bora   Pliki ini są wczytywane szybciej niż php gdyż mają...   7.03.2005, 15:06:38
- - Vengeance   A czy są szybsze od zserializowanej tablicy, zapis...   7.03.2005, 16:07:14
- - Imperior   Cytat(Vengeance @ 2005-03-07 15:07:14)A czy s...   7.03.2005, 17:09:23
- - hawk   @Bora: Pliki ini moze i sa wczytywane szybciej, al...   7.03.2005, 17:19:21
- - orson   witam ... a moze w ini zrobic 2 sekcje ... Kod...   7.03.2005, 22:59:24
- - hawk   A w jaki sposob z gory okreslisz, ktora sciezke ma...   8.03.2005, 00:10:53
- - Nievinny   A ja mam jeszcze pytanie dot. __autoload(). Czy je...   8.03.2005, 08:01:25
- - orson   Cytat(hawk @ 2005-03-08 00:10:53)A w jaki spo...   8.03.2005, 20:18:36
- - hawk   @Orson: nie o to mi chodzi. Masz np. (a raczej uży...   9.03.2005, 03:16:17
- - orson   witam ... hmm ... no to w pliku ini w sekcji clas...   9.03.2005, 07:31:00
- - dr_bonzo   @Nievinny: wyrzuc wyjatek w tej metodzie i sprawdz...   9.03.2005, 10:25:30
- - Nievinny   Owszem wywala wyjątek, ale nie obsługuje go w zwyk...   9.03.2005, 17:20:55
- - chmolu   Rozwiązanie z generowaniem mapy przez skanowanie k...   12.03.2005, 23:12:26
- - Vengeance   chmolu: Zauważ, że to Ty trzymasz każdą klasę w in...   13.03.2005, 01:10:23
- - chmolu   @Vengeance: to prawda, nie każdy musi trzymać każd...   13.03.2005, 09:44:36
- - bela_666   @chmolu a jak zmienisz ścieżke do smarty ?   13.03.2005, 10:44:30
- - chmolu   Nie używam Smarty więc nie ma żadnego problemu ...   13.03.2005, 12:43:09
- - Vengeance   @chmolu: ty nie. Ale z tego co wynika z twoich wyp...   13.03.2005, 13:43:28
- - chmolu   Zapewniam cię, że nie będzie to żaden problem A...   13.03.2005, 13:55:45
- - Ociu   Pozwole sobie odkopać temat Zastanawiam się czy ...   4.05.2005, 18:16:29
- - davidD   Tylko właściwie... po co XML do zwykłego przypisan...   5.05.2005, 00:09:50
- - matid   Ja to widzę tak: 1. Crowler, szuka po określonych ...   5.05.2005, 06:37:45
- - Ociu   Cytat(matid @ 2005-05-05 07:37:45)2. Dodatkow...   5.05.2005, 07:22:02
- - chmolu   IMO pliki XML w tym wypadku są niepotrzebne. Szybc...   5.05.2005, 08:24:02
- - Nievinny   XML to przeładowanie, a nam zależy na czasie, nie?...   5.05.2005, 17:06:02
- - matid   Cytat(Nievinny @ 2005-05-05 18:06:02)XML to p...   5.05.2005, 17:55:53
- - bigZbig   @matid -> zauwazylem u Ciebie duze przywiazanie...   10.05.2005, 09:28:27
- - Nievinny   @matid -> ale tą mapę musisz za każdym uruchomn...   10.05.2005, 16:01:11
- - matid   Cytat(Nievinny @ 2005-05-10 17:01:11)@matid -...   10.05.2005, 17:36:31
- - Nievinny   Czyli trzymasz tylko katalogi do parsowania? To ni...   10.05.2005, 18:24:33
- - Ociu   Cytat(matid @ 2005-05-10 18:36:31)Chodzi mi o...   10.05.2005, 19:40:08
- - matid   Cytat(Ociu @ 2005-05-10 20:40:08)Przemyślałem...   10.05.2005, 20:34:10
- - Vengeance   " trwa to ok. 0,4 s" lol :] Mój kod (a ...   10.05.2005, 21:26:35
- - matid   Cytat(Vengeance @ 2005-05-10 22:26:35)" ...   10.05.2005, 21:46:19
- - Ociu   Czepiasz się szczegółów, liczba była podana dla pr...   11.05.2005, 09:08:31
- - Vengeance   To nie było czepianie. Chodziło mi o sposób w jaki...   11.05.2005, 20:45:37
- - matid   Dla zainteresowanych - moja klasa Autoloader: http...   11.05.2005, 21:21:56
- - hawk   Skoro temat zrobił się popularny i każdy chce mieć...   12.05.2005, 09:45:30
- - bigZbig   @hawk -> Amen   12.05.2005, 09:49:20
- - dr_bonzo   ...mam i ja. Stworzylem swojego autoloadera: - w ...   26.05.2005, 15:15:11
- - Vengeance   Z twojego opisu wynika mi, że za każdym uruchomien...   26.05.2005, 18:37:05
- - dr_bonzo   CytatZ twojego opisu wynika mi, że za każdym uruch...   26.05.2005, 19:12:28
- - hawk   Ciekawe rozwiązanie. Faktem jest, że mi by się nie...   27.05.2005, 20:47:33
- - dr_bonzo   W koncu. Kod przepisany od nowa, lecz jeszcze nie ...   5.06.2005, 02:20:39
- - Imperior   dr_bonzo: http://wiki.php.pl/index.php/RecursiveDi...   5.06.2005, 13:02:34
- - hawk   Fajny kod. Nawet zdążyłem już użyć . Kilka uwag: ...   5.06.2005, 13:23:14
- - dr_bonzo   Cytat- nie można podać extension np. "class.p...   5.06.2005, 14:00:34
- - hawk   A co powiecie na taką implementację? [PHP] pobierz...   12.06.2005, 22:16:47
- - cagrET   hawk: widzę, że używasz "notacji węgierskiej...   13.06.2005, 13:24:34
- - hawk   Nie, nie czytałem do tej pory. Przedrostki określa...   13.06.2005, 20:10:13
- - matid   Cytat(hawk @ 2005-06-05 14:23:14)- przydatną ...   13.06.2005, 20:30:28
- - dr_bonzo   cagrET: link do swietnego serwisu. CytatZ jakiegoś...   13.06.2005, 21:03:51
- - hawk   @dr_bonzo i matid: Niestety, phpDocumentor nie ma,...   13.06.2005, 21:51:34
- - matid   Cytat(hawk @ 2005-06-13 22:51:34)@dr_bonzo i ...   13.06.2005, 22:12:12
- - hawk   @matid: Pomysł wręcz genialny w swojej prostocie. ...   16.06.2005, 12:17:19
- - matid   No rzeczywiście, @scope będzie lepsze. Spróbuję to...   16.06.2005, 15:48:55
- - hawk   @serafin: 1) Nikt ci nie broni tworzyć takiej map...   16.06.2005, 18:31:01
- - hawk   Cytat("serafin")Hawk: Wykorzystales 10 p...   16.06.2005, 20:42:41
- - matid   Cytat(serafin)Ma to sens? A dlaczego nie? Mi osobi...   16.06.2005, 22:08:29
- - bela_666   Cytat(matid @ 2005-06-16 23:08:29)Cytat(seraf...   16.06.2005, 22:12:29
- - Imperior   Cytat(matid @ 2005-06-16 21:08:29)Ma ktoś jak...   17.06.2005, 07:20:58
- - matid   Chyba jednak skorzystam z opcji 1, ponieważ zasięg...   17.06.2005, 07:42:50
2 Stron V   1 2 >


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2024 - 23:02