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  « < 5 6 7 8 9 > »   
Reply to this topicStart new topic
> Włączanie plików + autoloader, chętnie bym posłuchał ciekawych pomysłów
Ociu
post
Post #121





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




Cytat(squid @ 2006-01-17 14:12:04)
co nazywacie mapa? Czy jest to skojarzona z klasa sciezka dostepu (dla kazdej klasy)?

Mapa to 'lista' scieżek i nazwy klas.

dajmy na to (posłuże się autoloaderem z phienda2):
  1. <?php
  2. $map = array (
  3. # przyklad: 'nazwa_klasy' => 'sciezka_do_pliku.php'
  4. 'Request' => './framework/request.class.php',
  5. 'Response' => './fremework/response.class.php'
  6. );
  7.  
  8. Autoloader::addMap($map);
  9. ?>


pozdrawiam
Go to the top of the page
+Quote Post
bela
post
Post #122


Administrator PHPedia.pl


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

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


NuLL, pytanie moje brzmi, czy każdy komponent może pracować oddzielnie? Tzn robisz ctrl c, v, wrzucasz do innego katalogu i działa.
Btw. co Ty masz w tych komponenach?
Go to the top of the page
+Quote Post
NuLL
post
Post #123





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


bela_666 - moze, nie wszystkiego bo czesc jest zalezna od Db dla przykladu.

Co mam ? Db, Cache, Configuration, Template, Debug, Image itp itd. - Cala aplikacja krotko mowiac.
Go to the top of the page
+Quote Post
hawk
post
Post #124





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

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


@NULL: IMHO rozwiązaniem problemu ze zbyt dużą liczbą wpisów jest sklejenie tego we większe pliki. Autoloadowanie tego wszystkiego zajmuje jednak sporo czasu. Ideałem jest dla mnie rozwiązanie, gdy po ustaleniu, jakie komponenty są nam potrzebne, robimy z tego wersję release pakując automatycznie do jednego pliku i tak dystrybuujemy. Lokalnie mamy wersję dev z rozbiciem na małe pliki, a dzięki autoloaderowi cała operacja jest przezroczysta - mamy tylko inną mapę. Natomiast plików specyficznych dla konkretnego żądania, np. klas akcji, nie warto pakować do mapy, bo by się zbyt duża zrobiła.
Go to the top of the page
+Quote Post
squid
post
Post #125





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(hawk @ 2006-01-24 09:54:37)
@NULL: IMHO rozwiązaniem problemu ze zbyt dużą liczbą wpisów jest sklejenie tego we większe pliki. Autoloadowanie tego wszystkiego zajmuje jednak sporo czasu. Ideałem jest dla mnie rozwiązanie, gdy po ustaleniu, jakie komponenty są nam potrzebne, robimy z tego wersję release pakując automatycznie do jednego pliku i tak dystrybuujemy. Lokalnie mamy wersję dev z rozbiciem na małe pliki, a dzięki autoloaderowi cała operacja jest przezroczysta - mamy tylko inną mapę. Natomiast plików specyficznych dla konkretnego żądania, np. klas akcji, nie warto pakować do mapy, bo by się zbyt duża zrobiła.

takie rozwiazanie jest kosztowne o tyle ze trzeba napisac cos na ksztalt kompilatora i linkera, ktory zajmnie sie przerobieniem wersji dev na produkcyjna. Nie jest moze to duzy problem bo napisanie to operacja jednorazowal ale zawsze po bokonaniu zmian przeba bedzie uzyc czegos co na nowo zapakuje nam klasy w pliki i wydaje mi sie ze jest to duzo zbednej i nikomu niepotrzebnej roboty zwlaszcza ze narzut czasowy zwiazany z dolaczaniem kolejnych plikow da sie zniwelowac w sosobo o jakim mowilem. Jest to rozwiaznie darmowe wydajne i nie trzeba niczego zmieniac w istniejacych projekatach.

Abstrachujac od tego co powiedzialem wczesniej, mam tu prosty przyklad na wykorzystanie funkcji __autoload():

autoload.lib.php:
  1. <?php
  2. function __autoload ( $className )
  3. {
  4. $classDir = './class/';
  5. $separator = '_';
  6.  
  7. $path2Class = str_replace ( $separator, '/', $className );
  8.  
  9. require_once $classDir . $path2Class . '.class.php';
  10. }
  11. ?>


a.class.php:
  1. <?php
  2. // moze byc zaladowane duzo wczesniej np. przez kontroler
  3. require_once './autoload.lib.php';
  4.  
  5. class a
  6. {
  7. public function __construct ()
  8. {
  9. echo "<p>Zaraz zaladuje nowa klase </p>";
  10. new katalog_b ();
  11. }
  12. }
  13.  
  14. new a();
  15. ?>


katalog_b.class.php:
  1. <?php
  2. class katalog_b
  3. {
  4. public function __construct ()
  5. {
  6. echo "jestem w klasie b </ br>";
  7. }
  8. }
  9. ?>

proste i pozwala na zdefiniowanie jednej prostej f-cji kotra zajmie sie sama wlaczaniem klas jesli taki nie zostaly jeszcze dolaczone.
Sposob nazewnistwa jest oczywiscie umowny i mozna stosowac dla rozroznienia katalogow i plikow male i wielkie litery lub cokolwiek innego. Mozna tez trzymac tablice globalna z plikami ktore juz zaladowalismy i sprawdzac czy oplaca sie uzyc f-cji *_once (to juz bylo chyba wspomniane), chociaz nie wiem czy jest sens bo jesli plik jest juz zaladowany to f-cja __autoload() nie zostanie wywolana.

Co jest tu problemem? Zewnetrzne pakiety i klasy na ktorych nazewnictwo i polozenie nie mamy wplywu. Moze tutaj zwykly include_path rozwiazalby problem? Napewno wystarcza to do PEAR co do innych pakietow to chyba tak czy siak trzeba rozpatrywac to osobno bo napewno autorzy kody przewidzieli swoje sosoby dolaczania innych klas itp.

Co o tym myslicie?

EDIT:
idac dalej mozna zadbac rowniez o wlaczanie interfejsow i wyjatkow w podobny sposob:
  1. <?php
  2.  
  3. function __autoload ( $className )
  4. {
  5. $classDir = './classes/';
  6. $classSuffix = '.class.php';
  7.  
  8. $interfaceDir = './interfaces/';
  9. $interfaceSuffix = '.php';
  10.  
  11. $exceptionDir = './exceptions/';
  12. $exceptionSuffix = '.php';
  13.  
  14. $separator = '_';
  15.  
  16. if ( $className[0] == 'i' )
  17. { // interfejs
  18. $file = $interfaceDir . str_replace ( $separator, '/', $className ) . $interfaceSuffix;
  19. }
  20. else if ( $className[0] == 'e' )
  21. { // wyjatek
  22. $file = $exceptionDir . str_replace ( $separator, '/', $className ) . $exceptionSuffix;
  23. }
  24. else 
  25. { // klasa
  26. $file = $classDir . str_replace ( $separator, '/', $className ) . $classSuffix;
  27. }
  28.  
  29. if ( !file_exists( $file) )
  30. {
  31. throw new eClassNotFound();
  32. }
  33.  
  34. require $file;
  35. }
  36. ?>


oczywiscie zmienne mozna ladowac z jakiegos configa ale mamy teraz wszystko co potrzeba nam do automatycznego ladowania klas

Ten post edytował squid 16.02.2006, 15:39:42
Go to the top of the page
+Quote Post
eMartio
post
Post #126





Grupa: Zablokowani
Postów: 46
Pomógł: 0
Dołączył: 12.01.2006

Ostrzeżenie: (10%)
X----


Cytat(DeyV @ 2005-02-10 20:46:51)

Cytat
Takie mapy można nawet generować automatycznie przeszukując skryptem katalogi i parsując (tokenizując) pliki php.


Co oznacza pojęcie tokenizując w programowaniu? Token to symbol... w wolnym tłumaczeniu.

Cytat
Aby sprawę jeszcze bardziej skomplikować - warto pamietać o tym - że require_once i inlude_once jest w rzeczywistości bardzo wolne


A więc co polecasz? Najlepiej stosować samo: require i include? Czy może jeszcze coś innego?
Go to the top of the page
+Quote Post
matid
post
Post #127





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

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


Cytat(eMartio @ 2006-03-31 19:40:31)
Co oznacza pojęcie tokenizując w programowaniu? Token to symbol... w wolnym tłumaczeniu.

Google dzisiaj nie działa?
http://google.com/search?q=define:tokenize
Go to the top of the page
+Quote Post
bela
post
Post #128


Administrator PHPedia.pl


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

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


Cytat(eMartio @ 2006-03-31 20:40:31)
Cytat
Takie mapy można nawet generować automatycznie przeszukując skryptem katalogi i parsując (tokenizując) pliki php.


Co oznacza pojęcie tokenizując w programowaniu? Token to symbol... w wolnym tłumaczeniu.

Sam tłumaczysz sobie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
To jest rozbicie pliku źródłowego na tablice symboli. Jest to pierwszy etap analizy kodu źródłowego.
Więcej, google: kompilator i interpretator
Go to the top of the page
+Quote Post
NuLL
post
Post #129





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Czy ktos moze wykonywal testy po jakims ciezkim obciazeniem aplikacji pracujacej na autoloaderze i bez niego ? Chetnie bym posluchal jakis opinii. Wiem ze jest to dosc wolne ale czy az tak (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Zastanawia mnie tak kwiestia jakoze zalozmy Panowie z ez.no postanowili w eZ Components jechac na autoloadzie napewno zdajac sobie sprawe z problemu wydajnosci (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Co sadzicie o tym ? Pisac z __autoload() czy bez ? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Ludvik
post
Post #130





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Ja osobiście wszystko mam przygotowane pod autoloadera. Co z wydajnością? Przy cache mapy klas i włączonym xdebugu załadowanie wszystkich klas i systemu zajmuje ok. 35ms, a samo nawiązanie połączenia przez PDO z PostgreSQL na localhoście ok. 230, więc strata wydajności nie jest duża. Z tych 35ms połowa to require_once. Myślę, że nie jest to zbyt duża strata wydajności w porównaniu do ułatwienia pisania kodu.

Na poważnych serwerach kod zenda jest i tak trzymany w pamięci, więc straty są jeszcze mniejsze.
Go to the top of the page
+Quote Post
squid
post
Post #131





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


przy dobrym projekcie autoloadera mozna ominac f-cje *_once mozna podniesc wydajnosc tak ze autoloadowanie bedzie praktycznie niezauwazalne
Go to the top of the page
+Quote Post
NuLL
post
Post #132





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


@Ludvik - dzieki za wiesci - o cos takiego mi chodzilo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Teraz tylko czekac na otwarty autoloader od eZ components i po bolu.
Go to the top of the page
+Quote Post
Vengeance
post
Post #133





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

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


To ciekawe co mówicie, bo w mojej aplikacji autoload() zajmował 98% czasu wykonywania (tak, tak... i to już z cache mapy w pliku!). Wróciłem do require_once. Zresztą takie rozwiązanie jest dużo czytelniejsze przy późniejszej analizie kodu. Wiadomo gdzie co jest trzymane (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
squid
post
Post #134





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Cytat(Vengeance @ 10.06.2006, 18:38 ) *
To ciekawe co mówicie, bo w mojej aplikacji autoload() zajmował 98% czasu wykonywania (tak, tak... i to już z cache mapy w pliku!). Wróciłem do require_once. Zresztą takie rozwiązanie jest dużo czytelniejsze przy późniejszej analizie kodu. Wiadomo gdzie co jest trzymane (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

pewnie te 98% czasu zajmowalo wlaczenie analiza i interpretacja kodu co chyba nie jest rownowazne z narzutem czasu samego autoloadera.

P.S.
Obecnie nie mam czasu ale za klika tygodni postawie odizolowana maszyne i przeprowadze profilowanie zeby sprawdzis te teorie
Go to the top of the page
+Quote Post
bigZbig
post
Post #135





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Ja tez uzywam autoloadera, ale nie tworze jednej globalnej tablicy, a juz napewno nie generuje jej automatycznie. Staram się tworzyć pakiety. Kazdy pakiet ma swoj plik inicjalizacyjny, w ktorym jest m.in. mapa klas. Jesli dolaczam dany moduł (pakiet) do aplikacji poprzez includowanie jego pliku inicjalizujacego to juz mechanizm zawarty w tym pliku zajmuje się dołączeniem mapy klas danego pakietu do ogolnej mapy klas całej aplikacji na ktorej operuje funkcja __autoload. Dla wygody testowania zaimplementowalem tez mozliwosc ominiecia autoloadera. Tracę tym może nieznacznie na wydajności, ale znacznie zyskuję na wygodzie. Poniższy przykład ilustruje to o czym pisałem:

  1. <?php
  2. /**
  3.  * @author hawk
  4.  */
  5. class bigAutoloader {
  6. private static $aMap = array();
  7.  
  8. public static function load($sName) {
  9. if (array_key_exists($sName, self::$aMap)) {
  10. include self::$aMap[$sName];
  11. }
  12. if (!class_exists($sName) && !interface_exists($sName)) {
  13. eval("class $sName { 
  14. public function __construct() { 
  15. throw new ClassNotFoundException('$sName not found'); 
  16. }
  17. }");
  18. }
  19. }
  20.  
  21. public static function addMap($aMap) {
  22. self::$aMap = array_merge(self::$aMap, $aMap);
  23. }
  24. }
  25. ?>


  1. <?php
  2. /**
  3.  * bigLang inicjalizator
  4.  */
  5. if (!defined('BIGLANG_DIR')) define('BIGLANG_DIR',dirname(__FILE__));
  6. $aClassesMap = array(
  7. 'bigLang' => BIGLANG_DIR.'/bigLang.abstract.php',
  8. 'bigLangManager' => BIGLANG_DIR.'/bigLangManager.class.php',
  9. );
  10.  
  11. if (class_exists('bigAutoloader')) {
  12. bigAutoloader::addMap($aClassesMap);
  13. } else {
  14. foreach($aClassesMap as $sClassName) {
  15. include_once($sClassName);
  16. }
  17. }
  18.  
  19. ?>



@Vengeance - wybacz, ale wydaje mi sie, że jednak się mylisz. Bo jeśli używając funkcji __autoload dołączam potrzemne pliki przy pomocy instrukcji include, lub require, a Ty posługujesz się require_once lub include_once to zadaj sobie pytanie co jest bardziej wydajne. Czy narzut czasowy potrzebny dla samego wywołania funkcji autoladujacej jest faktycznie tak duży? Poza tym autoloader dolancza jedynie te pliki, ktore sa wymagane, a zastosowanie bezposrednio *_once dołącza zawsze wszystkie pliki - nawet jesli ich zawartość nie jest w danym wywołaniu potrzebna.

Ten post edytował bigZbig 12.06.2006, 08:05:51
Go to the top of the page
+Quote Post
Vengeance
post
Post #136





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

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


Jakie argumenty by tu nie padały, i tak nic nie zmieni mojego "self experience" gdzie Zend pokazywał 98% dla samego autoloadu.

Ja nie twierdze, że ta metoda jest cool, albo że jest do dupy. Mówię tylko, że z początku stosowałem ją ale zrezygnowałem.

Jednym z argumentów przeciw jest choćby czytelność kodu (z mojego punktu widzenia).

Że już nie wspomne o np. umiejetnośći podpowiadania składni w edytorach :] Które bardzo mocno wspierają się na include i require w kodzie... a autoload powoduje oduczenie ich umiejętności poprawnego podpowiadania.
Go to the top of the page
+Quote Post
bigZbig
post
Post #137





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Argument o czytelności kodu do mnie nie przemawia bo wszystkie pliki dolanczam (dokladam do mapy klas) w scisle okreslonych miejscach. W plikach poszczegolnych klas nie ma miejsca na dolanczanie zaleznosci jak np. definicje wyjatkow. Od tego mam plik inicjalizujacy dany pakiet i jest to wygodne. W zasadzie przy takim podejsciu to nie ma znaczenia czy uzyjesz autoloadera, czy bezposrednio require.

Wada tego rozwiazania jest oczywiscie to, ze chcac uzyc tylko jednej klasy z calego pakietu musisz sie upewnic czy do jej dzialania nie jest wymagana obecnosc jakiegos innego pliku.

Co do edytorow i podpowiadania skladni - argument wart przemyslenia. Tak swoja droga jakiego edytora uzywasz?
Go to the top of the page
+Quote Post
NuLL
post
Post #138





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat
Że już nie wspomne o np. umiejetnośći podpowiadania składni w edytorach :] Które bardzo mocno wspierają się na include i require w kodzie... a autoload powoduje oduczenie ich umiejętności poprawnego podpowiadania.

W Zendzie nie ma z tym problemu.
Go to the top of the page
+Quote Post
orson
post
Post #139





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

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


witam

eclipse przechowuje informacje o wszystkich klasach w cache ... więc w nim nie ma problemu z używaniem metod z obiektów nie włączonych jawnie do kodu ...

używam autoloadera z mapą i uważam że jest to bardzo wydajne i wygodne rozwiązanie ... jak mi się uda to włączę xdebuga na jakimś serwerze u mnie w pracy i zrobię testy i profilowanie na żywej aplikacji (ale to po długim weekendzie dopiero)

pozdrawiam
Go to the top of the page
+Quote Post
eai
post
Post #140





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Ja generuje sobie mapę przy instalacji aplikacji. Zapisuje w pliku tekstowym z zakodowanym serialize();

Mapa wyglada tak:
Kod
Array
(
    [Action] => Array
        (
            [Dir] => Actions/
            [Elements] => Array
                (
                    [ImageFunctions] => Array
                        (
                            [Dir] => Image/
                            [Class] => Array
                                (
                                    [ImageHandler] => Array
                                        (
                                            [file] => Img.Handler.php
                                            [SubDir] =>
                                        )

                                    [ImageDraw] => Array
                                        (
                                            [file] => Img.Handler.php
                                            [SubDir] =>
                                        )

                                )

                        )

                    [SessionHandler] => Array
                        (
                            [Dir] => Session/
                            [Class] => Array
                                (
                                    [Session] => Array
                                        (
                                            [file] => Session.Handler.php
                                            [SubDir] =>
                                        )

                                )

                        )

                )

        )

    [Core] => Array
        (
            [Dir] => Core/
            [Elements] => Array
                (
                    [View] => Array
                        (
                            [Dir] => View/
                            [Class] => Array
                                (
                                    [view] => Array
                                        (
                                            [file] => view.php
                                        )

                                    [View] => Array
                                        (
                                            [SubDir] =>
                                        )

                                )

                        )

                )

        )

    [Plugin] => Array
        (
            [Dir] => Plugins/
            [Elements] => Array
                (
                    [DBHandler] => Array
                        (
                            [Dir] => DbHandler/
                            [Class] => Array
                                (
                                    [mySQL] => Array
                                        (
                                            [file] => Db.MySql.php
                                            [SubDir] =>
                                        )

                                    [pgSQL] => Array
                                        (
                                            [file] => Db.pgSql.php
                                            [SubDir] =>
                                        )

                                )

                        )

                )

        )

)


AutoLoader robie na 2 sposoby.
1. Szukam klasy w mapie i includuje ja sprawdzajac czy taki plik istnieje
2. Szukam Calego modulu Np ImageFunctions i includuje wszystkie klasy [nie Classy] z tej mapy.

--
"klasy"
dr_bonzo

Ten post edytował dr_bonzo 5.08.2006, 17:21:26
Go to the top of the page
+Quote Post

10 Stron V  « < 5 6 7 8 9 > » 
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 Aktualny czas: 21.11.2025 - 00:11