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.

10 Stron V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Włączanie plików + autoloader, chętnie bym posłuchał ciekawych pomysłów
Imperior
post 7.03.2005, 17:09:23
Post #41





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 16.10.2004

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


Cytat(Vengeance @ 2005-03-07 15:07:14)
A czy są szybsze od zserializowanej tablicy, zapisanej w pliku ? smile.gif

Jeśli to nie jest pytanie retoryczne, to: Nie.


--------------------
Com powiedział, powiedziałem.
Go to the top of the page
+Quote Post
hawk
post 7.03.2005, 17:19:21
Post #42





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

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


@Bora: Pliki ini moze i sa wczytywane szybciej, ale zamiana %APP_DIR% na odpowiednia sciezke niestety zepsuje tutaj wydajnosc.
Go to the top of the page
+Quote Post
orson
post 7.03.2005, 22:59:24
Post #43





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam ...

a moze w ini zrobic 2 sekcje ...
Kod
[path]
app_dir = "./jakis/dir/"
trans_dir = "./jakis/dir"
jakis_dir = "./jakis/dir"
[clases]
class = file_name
class = file_name
class = file_name

i potem parse ini ze znacznikiem true i mamy sklejanie stringow ...
  1. <?php
  2. $array['path']['app_dir'].$array['path']['class']
  3. ?>

i nie trzeba nic zamieniac ... i da sie latwo konfigurowac w tym samym ini ...

pozdrawiam


--------------------
Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
Go to the top of the page
+Quote Post
hawk
post 8.03.2005, 00:10:53
Post #44





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

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


A w jaki sposob z gory okreslisz, ktora sciezke masz dokleic do konkretnej klasy? Nie zrobisz tego, chyba ze narzucisz sobie jakies bardzo scisle reguly, a tego wole uniknac.
Go to the top of the page
+Quote Post
Nievinny
post 8.03.2005, 08:01:25
Post #45





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

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


A ja mam jeszcze pytanie dot. __autoload(). Czy jeśli wywołam w niej statyczną metodę która w razie niepowodzenia wywala wyjątek, to trzeb go obsłużyć w __autoload() czy przejdzie poziom wyżej?
Przykład:
  1. <?php
  2.  
  3. function __autoload( $sClassName ) {
  4. Application::loadClass( $sClassName );
  5. }
  6.  
  7. //czy
  8.  
  9. function __autoload( $sClassName ) {
  10. try {
  11. Application::loadClass( $sClassName );
  12. }
  13. catch( NotFoundClassException $e ) {
  14. //coscos
  15. }
  16. }
  17.  
  18. ?>


Czy 1 sposób też może być? Czy wyjątek zostanie obsłużony?


--------------------
Go to the top of the page
+Quote Post
orson
post 8.03.2005, 20:18:36
Post #46





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


Cytat(hawk @ 2005-03-08 00:10:53)
A w jaki sposob z gory okreslisz, ktora sciezke masz dokleic do konkretnej klasy? Nie zrobisz tego, chyba ze narzucisz sobie jakies bardzo scisle reguly, a tego wole uniknac.

witam ..

no przeciez normalnie ...
Kod
[path]
mainAppPath = '/home/user/public_hmtl/site/'
mainImagesPath = '/home/user/public_hmtl/site/images/'
cos tam
cos tam
default = 'clases/'
[clases]
dbclass = 'clases/db.class.php'
session = 'clases/session.class.php'
mail = '3rdpart/clases/mail/mail.class.php'
;z defaultem
dbclass = 'db.class.php'
session = 'session.class.php'

i potem:
  1. <?php
  2.  
  3. print $iniFile['path']['mainAppPath'].$iniFile['clases']['dbclass'];
  4. print $iniFile['path']['mainAppPath'].$iniFile['clases']['session'];
  5. //defaultem
  6. print $iniFile['path']['mainAppPath'].$iniFile['path']['default'].$iniFile['clases']['dbclass'];
  7.  
  8. ?>

w sekcji clases tez moga byc sciezki podane, przeciez to lokalizacja pliku a nie nazwa klasy ... czyli dajesz najpierw najbardziej ogolna a potem w poszczegolnych klasach dodajesz, podkatalogi ... mozna na sztywno dodac default do kodu strony a jak cos sie zmieni [ale znowu bez przesady ... tak czesto sie nie zmienia i klasy i tak sa w 1 miejscu] to zmienic albo nawet wyzerowac default

pozdrawiam


--------------------
Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
Go to the top of the page
+Quote Post
hawk
post 9.03.2005, 03:16:17
Post #47





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

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


@Orson: nie o to mi chodzi. Masz np. (a raczej użytkownik systemu ma) Smarty, kawałek WACT i w ogóle przynajmniej kilka bibliotek, których używa. Przecież nie będzie tak, że jeden super framework robi wszystko najlepiej, więc autoloader nie powinien być ograniczony do tego, co sami sobie wymyślimy, tylko po prostu działać tak jak chce użytkownik.

Nie powiesz teraz użytkownikowi, że ma to wszystko umieścić w innym katalogu. Będzie miał Smarty w jakimś niestandardowym miejscu, będzie chciał użyć razem z super-autoloaderem i będzie oczekiwał, że autoloader załaduje mu Smarty - od tego przecież jest.

I co wtedy? Skąd autoloader ma wiedzieć, że Smarty akurat nie jest pod mainAppPath?

PS
Cytat
...mozna na sztywno dodac default do kodu strony a jak cos sie zmieni...

Nie można. Autoloader jest po to, żeby tego kodu w ogóle nie było. Nie ma gdzie dodawać defaulta.
Go to the top of the page
+Quote Post
orson
post 9.03.2005, 07:31:00
Post #48





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam ...

hmm ... no to w pliku ini w sekcji clases podajesz
Kod
[clases]
smarty = /full/path/to/smarty/lib/smarty.php

a zeby bylo latwiej mozna np. wprowadzic ifa przy ladowaniu i np. jak nazwa klasy zaczyna sie od 2 // a nie od 1 to laduj bez patha .... czyli jak dopiszemy // przed smarty to oleje sekcje path i biblioteka moze byc gdziekolwiek ...
rozwiazanie z plikiem ini coraz bardziej mi sie podoba ... chyba zaczne go stosowac ...

pozdrawiam


--------------------
Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
Go to the top of the page
+Quote Post
dr_bonzo
post 9.03.2005, 10:25:30
Post #49





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


@Nievinny: wyrzuc wyjatek w tej metodzie i sprawdz. Wyjatek wedruje w gore do ekranu (error) dopuki go nie zlapiesz gdzies po drodze.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Nievinny
post 9.03.2005, 17:20:55
Post #50





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

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


Owszem wywala wyjątek, ale nie obsługuje go w zwykły sposób, a skrypt wychwytuje wyjątek "po drodze", tylko wywala fatal errora.

@dr_bonzo: To co mówisz byłoby dobre, gdyby funkcję wywoływać w ten sposób:
  1. <?php
  2.  
  3. __autoload( $zmienna );
  4.  
  5. ?>

A nie jeśli zostaje ona wykonana automatycznie... :/
Zostaje obsługa błędów na poziomie funkcji. Jeśli obsługujemy przez funkcję to pojawiają się problemy:
1) Jeśli klasą którą ładuje system jest klasa obsługi błędów?
  1. <?php
  2.  
  3. //$zmienna = 'Debug';
  4. function __autoload( $zmienna ) {
  5. try {
  6. CORE::zaladuj( $zmienna )
  7. } catch( Exception $e ) {
  8. print Debug::display( $e );
  9. }
  10. }
  11.  
  12. ?>


Znajdą się też inne problemy... :/
Macie jakieś pomysły jak ładnie obsłużyć ten wyjątek?


--------------------
Go to the top of the page
+Quote Post
chmolu
post 12.03.2005, 23:12:26
Post #51





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

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


Rozwiązanie z generowaniem mapy przez skanowanie katalogów wydaje się najlepsze. Jednak sposób Vengeance'a nie jest zbyt efektywny. Wymaga wczytania zawartości każdego pliku z osobna i sprawdzania, czy zawiera on jakieś klasy. Może jest to bardziej elastyczne, gdy mamy po kilka klas w jednym pliku, ale ja to zrobiłem inaczej.

U mnie każda klasa jest w osobnym pliku. Nazwa pliku zawierającego definicję klasy lub interfejsu kończy się na .class.php lub interface.php. I tylko takie pliki są ładowany do mapy.

Wycinki kodu z mojego frameworka:
  1. <?
  2. /**
  3.    * Checks whether the specified path exists.
  4.    * If the directory is not found, it'll try to create one.
  5.    *
  6.    * @param string $dirname 
  7.    * @return void
  8.    */
  9. function ensure_directory_exists($dirname)
  10. {
  11. $dirname = substr($dirname, strlen(APP_DIR));
  12.  
  13. $sub_dirs = explode('/', $dirname);
  14. $path = '';
  15. foreach ($sub_dirs as $dir)
  16. {
  17. $path .= $dir . '/';
  18. if (!file_exists($path))
  19. {
  20. if (!@mkdir($path, 0777))
  21. {
  22. throw new DaeronException('Could not create a directory \"' . $path . '\"');
  23. }  
  24. }
  25. }
  26. }
  27.  
  28. /**
  29.    * Writes the supplied content to a file.
  30.    *
  31.    * @param string $filename Name of a file to write to.
  32.    * @param mixed $content Data to write to a file.
  33.    * @return void
  34.    */
  35. function file_write($filename, $content)
  36. {
  37. ensure_directory_exists(dirname($filename));
  38. $fp = @fopen($filename, 'w');
  39. if($fp)
  40. {
  41. @fputs($fp, $content, strlen($content));
  42. }
  43. @fclose($fp);
  44. }
  45.  
  46. class Autoloader
  47. {
  48. /**
  49.  * Map of class names and their localization. 
  50.  *
  51.  * @var array
  52.  * @static 
  53.  */
  54. private static $map = null;
  55.  
  56. /**
  57.  * Loads specified class.
  58.  *
  59.  * @param string $class_name
  60.  * @return void 
  61.  */
  62. public static function load($class_name)
  63. {
  64. $cached_map = APP_DIR . '/var/cache/autoload.php';
  65. if (!is_readable($cached_map))
  66. {
  67. self::generateMap();
  68. }
  69.  
  70. if (!isset(self::$map)) require_once $cached_map;
  71.  
  72. $class_name = strtolower($class_name);
  73. if (!isset(self::$map[$class_name]))
  74. {
  75. throw new Exception('Unknown class ' . $class_name);
  76. }
  77.  
  78. require_once self::$map[$class_name];
  79. }
  80.  
  81. /**
  82.  * 
  83.  * 
  84.  *  
  85.  */
  86. private static function generateMap()
  87. {
  88. self::$map = array();
  89.  
  90. $cached_map = APP_DIR . '/var/cache/autoload.php';
  91.  
  92. self::scan(DAERON_DIR);
  93. self::scan(APP_DIR);
  94.  
  95. $compiled = &#092;"<?phpn\";
  96. $compiled .= 'self::$map = ' . var_export(self::$map, true) . &#092;"n?>\";
  97.  
  98. file_write($cached_map, $compiled);  
  99. }
  100.  
  101. /**
  102.  * 
  103.  * 
  104.  *  
  105.  */
  106. private static function scan($dir)
  107. {
  108. $match = array();
  109.  
  110. $rd = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), true);
  111. foreach ($rd as $file)
  112. {
  113. if(!is_file($file->getPathname())) continue;
  114.  
  115. if (preg_match('/([a-z0-9_]+).(class|interface).php$/i', $file->getPathName(), $match))
  116. {
  117. self::$map[strtolower($match[1])] = $file->getPathName();
  118. }
  119. }  
  120. }
  121. }
  122.  
  123. function __autoload($class_name)
  124. {
  125. Autoloader::load($class_name);
  126. }
  127. ?>


Porównanie szybkości (dla stosunkowo małej liczby plików):
- czytanie mapy z generowaniem: 35,67 ms
- czytanie z cache'owanej mapy: 00,57 ms

Kod Vengeance'a:
- czytanie mapy z generowaniem: 129.35 ms

A czytanie z cache wygląda identycznie smile.gif

Ten post edytował chmolu 13.03.2005, 12:41:45
Go to the top of the page
+Quote Post
Vengeance
post 13.03.2005, 01:10:23
Post #52





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


chmolu: Zauważ, że to Ty trzymasz każdą klasę w innym pliku!

A jak byś chciał dodać do frameworka np. AdoDB, Smarty czy inne rzeczy? One nie stosują twojego nazewnictwa.

Po to właśnie ten mój* skrypt przeszukuje wszystkie pliki wczytując je!

Skoro twoje nazewnictwo jest tak ustandaryzowane to w jakim celu w ogóle tworzyć mape ? przecież wystarczy zrobić

require $className . '.class.php'; hehe

* przypominam, iż nie czuje się właścicielem skryptu smile.gif posklejałem kod z wielu wypowiedzi innych osób i wrzuciłem smile.gif


--------------------
Go to the top of the page
+Quote Post
chmolu
post 13.03.2005, 09:44:36
Post #53





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

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


@Vengeance: to prawda, nie każdy musi trzymać każdą klasę w innym pliku. Dla mnie takie rozwiązanie jest najwygodniejsze.

Cytat
A jak byś chciał dodać do frameworka np. AdoDB, Smarty czy inne rzeczy? One nie stosują twojego nazewnictwa.

Autoloader u mnie ma służyć tylko do ładowania klas należących do jądra i aplikacji. Biblioteki typu Smarty i AdoDB zaliczam do "zewnętrznych" części aplikacji, którymi zająć musi się odpowiednia akcja/widok. Poza tym zauważ, że w przypadku tych bibliotek musimy włączyć tylko jeden główny plik, który już sam zajmuje się potrzebnymi mu plikami.
(btw: główny plik Smarty ma nazwę Smarty.class.php, więc pasuje do mojego nazewnictwa tongue.gif)

Cytat
Skoro twoje nazewnictwo jest tak ustandaryzowane to w jakim celu w ogóle tworzyć mape ? przecież wystarczy zrobić

require $className . '.class.php'; hehe

Ale dzięki mapie struktura katalogów jest dowolna. Mogę sobie w dowolny sposób podzielić na różne katalogi i podkatalogi, a gdy zajdzie potrzeba zmiany struktury wystarczy tylko wygenerowac mapę i nie trzeba grzebać w kodzie i poprawiać wszystkich ścieżek.

Ten post edytował chmolu 13.03.2005, 09:52:28
Go to the top of the page
+Quote Post
bela
post 13.03.2005, 10:44:30
Post #54


Administrator PHPedia.pl


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

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


@chmolu a jak zmienisz ścieżke do smarty ? biggrin.gif


--------------------
Go to the top of the page
+Quote Post
chmolu
post 13.03.2005, 12:43:09
Post #55





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

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


Nie używam Smarty więc nie ma żadnego problemu biggrin.gif

// btw: poprawiłem troszkę ten kod

Ten post edytował chmolu 13.03.2005, 12:43:29
Go to the top of the page
+Quote Post
Vengeance
post 13.03.2005, 13:43:28
Post #56





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@chmolu: ty nie. Ale z tego co wynika z twoich wypowiedzi to co piszesz
to framework. Pewnie kiedys ktos inny z niego bedzie korzystac i moze chciec takze korzystac ze smarty smile.gif


--------------------
Go to the top of the page
+Quote Post
chmolu
post 13.03.2005, 13:55:45
Post #57





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

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


Zapewniam cię, że nie będzie to żaden problem aarambo.gif
Ale mam nadzieję, że zamiast Smarty ludzie będą używali systemu wbudowanego w mój framework (wzorowany na WACT/ASP/JSP).
Jak skończę, to zarzucę tu kod do oceny.

Ten post edytował chmolu 13.03.2005, 13:57:45
Go to the top of the page
+Quote Post
Ociu
post 4.05.2005, 18:16:29
Post #58





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Pozwole sobie odkopać temat winksmiley.jpg

Zastanawiam się czy nie użyć pliku xml ładowania klas. Coś na wzór:

  1. <Classes>
  2.  
  3. <dirname>
  4. <class name='jakas tam nazwa'>file.php</class>
  5. <class name='jakas tam nazwa2'>file2.php</class>
  6. </dirname>
  7.  
  8. <dirname2>
  9. <class name='jakas tam nazwa3'>file3.php</class>
  10. <class name='jakas tam nazwa4'>file3.php</class>
  11. </dirname2>
  12.  
  13. </Classes>


Potem bardzo prosto: simplexml, loader instacji (w moim przypadku) i tyle smile.gif

Iść dalej tym tropem, czy zacząć myśleć nad czymś innym ?
Go to the top of the page
+Quote Post
davidD
post 5.05.2005, 00:09:50
Post #59





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 10.10.2002

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


Tylko właściwie... po co XML do zwykłego przypisania nazwy pliku do nazwy klasy? IMO jest to lekkie komplikowanie sobie całej sprawy - no chyba, że chcemy przechowywać jakieś dodatkowe informacje.

Mnie osobiście podoba się pomysł z iteratorem, szukającym klas po wszystkich plikach o określonym wzorcu, w podanej ścieżce (ścieżkach). Można z tego zrobić ładną tablicę, zserializować ją i do pliku... Co prawda trzeba się troszkę pobawić samym pisaniem tego generatora mapy, ale za to później, przy zmianie położenia/nazw plików zaoszczędzi się duużo czasu.


--------------------
| WinXP | Apache 2.0.50 | php 5.0.3 | MySQL 4.0.20 | Zend Studio |
CMS::engine llllllllllllllllllll 80%
CMS::userInterface
Go to the top of the page
+Quote Post
matid
post 5.05.2005, 06:37:45
Post #60





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


Ja to widzę tak:
1. Crowler, szuka po określonych folderach w poszukiwaniu plików php zawierających klasy. Będzie miał możliwość wyszukiwania z filtrowaniem nazw plików, nazwach klas itp. Być może po dodaniu opcji filtracji czas generowania mapy się zwiększy nieco, ale na jakoże jest to czynność wykonywana rzadko, można sobie na to pozwolić.
2. Dodatkowy plik XML z klasami zewnętrznymi. W tym pliku będą zapisane w postaci XML dodatkowe klasy, które autoloader ma obsługiwać. Plik byłby parsowany i razem z wynikami crowlera zapisywany w pliku php w postaci tablicy.
Go to the top of the page
+Quote Post

10 Stron V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 03:32