Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Najoptymalniejszy sposób na __autoload z wielu katalogów
Ultear
post 8.09.2014, 17:29:14
Post #1





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Witam, zrobiłem __autoload, który wygląda tak o:

  1. $classes_dirs = array('libs/', 'application/controllers/', 'application/models/');
  2.  
  3. function __autoload($class){
  4.  
  5. global $classes_dirs;
  6.  
  7.  
  8.  
  9. try{
  10. require_once(autoload_class_existance($class, $classes_dirs));
  11. } catch(Exception $e){
  12. echo 'Caught exception'.$e->getMessage()."\n";
  13. }
  14. }


funkcja autoload_class_existance:

  1. function autoload_class_existance($class, $dirs){
  2.  
  3. foreach($dirs as $dir){
  4.  
  5. $path = APP_PATH.$dir.$class.'.php';
  6.  
  7. if(file_exists($path)){
  8. return $path;
  9. break;
  10. } else{
  11. continue;
  12. }
  13.  
  14. return false;
  15. }
  16.  
  17. }


Czy jest to dość optymalny sposób, czy da radę zrobić to lepiej?
Go to the top of the page
+Quote Post
irekk
post 8.09.2014, 18:12:57
Post #2





Grupa: Zarejestrowani
Postów: 64
Pomógł: 10
Dołączył: 2.08.2012
Skąd: DW

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


A nie lepiej oprzeć to o PSR-0?
Go to the top of the page
+Quote Post
pedro84
post 8.09.2014, 18:37:27
Post #3





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Zasadnicze pytanie: po co potrzebujesz bawić się w pisanie swojej funkcji ładującej?


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Ultear
post 8.09.2014, 18:47:58
Post #4





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Nie potrzebuje się bawić, po prostu zastanawiam się na nad najmniejszym i najoptymalniejszym wyjściem smile.gif
Go to the top of the page
+Quote Post
pedro84
post 8.09.2014, 19:04:29
Post #5





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Poczytaj sobie o klasie ładującej z PSR-0, jak Ci zaproponował @irekk. Z całym szacunkiem, ale wątpię, żebyś coś lepszego wymyślił wink.gif


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
by_ikar
post 8.09.2014, 19:18:30
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Taa zwłaszcza że jest już kilkanaście gotowych klas do autoładowania, które istnieją już od jakiegoś czasu, są przetestowane przez dziesiątki ludzi którzy nie tylko piszą w php, ale i go tworzą. Zawsze możesz użyć include_path, który wraca ostatnimi dniami jak bumerang wink.gif
Go to the top of the page
+Quote Post
Pyton_000
post 8.09.2014, 21:07:22
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Proszę bardzo. 10 stron postów. Same dobre rzeczy
Temat: Wlaczanie plikow autoloader
Go to the top of the page
+Quote Post
Ultear
post 8.09.2014, 21:27:23
Post #8





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Ok, zastosowałem klasę SplClassLoader, teraz tylko jest jeden problem:

Stuktura wygląda tak o:

-root
--application
-----models
-----views
-----controllers
--libs
-----Bootstrap.php



No i sprawa wygląda tak, że:

  1. require_once APP_PATH.'libs/SplClassLoader.php';
  2.  
  3. $loader = new SplClassLoader('Application', __DIR__);
  4. $loader->register();
  5.  
  6.  
  7. $Bootstrap = new Application\Libs\Bootstrap(); //Nie do konca wiem jak z tym postapic, z kolei, bez Application nie moze znaleźć klasy Libs\Bootstrap
  8.  


Bo jezeli chce autoloadowac biblioteke, ktora jest poza katalogiem application, to jest mały problem, bo:


Warning: require(X:\Server\root\Application\Libs\Bootstrap.php) [function.require]: failed to open stream: No such file or directory in X:\Server\blog\libs\SplClassLoader.php on line 152

Co w takim wypadku zrobic?

Ten post edytował Ultear 8.09.2014, 21:27:38
Go to the top of the page
+Quote Post
Pyton_000
post 8.09.2014, 21:38:44
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


libs wpakuj do aplications.
Go to the top of the page
+Quote Post
Ultear
post 8.09.2014, 21:43:58
Post #10





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Chciałbym później użyć libs w aplikacji backendowej, więc odpada
Go to the top of the page
+Quote Post
pedro84
post 8.09.2014, 21:55:09
Post #11





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Cytat(Ultear @ 8.09.2014, 22:43:58 ) *
Chciałbym później użyć libs w aplikacji backendowej, więc odpada

Dlaczego? Nie możesz zastosować normalnej struktury?
Kod
src
src/Application


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Ultear
post 8.09.2014, 22:03:25
Post #12





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Mógłbyś mi rozpisać prawidłową strukture MVC?
Byłbym wdzięczny smile.gif
Go to the top of the page
+Quote Post
pedro84
post 8.09.2014, 22:10:06
Post #13





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Cytat(Ultear @ 8.09.2014, 23:03:25 ) *
Mógłbyś mi rozpisać prawidłową strukture MVC?

Nie chcę Ci zmartwić, ale... nie ma czegoś takiego smile.gif Obecnie spora część projektów, korzysta z loadera z PSR-0, co wiąże się z pewnymi wymaganiami odnośnie struktury. Zobacz na ten projekt na Githubie: https://github.com/thephpleague/flysystem.

Masz główny katalog src (ewentualnie lib - jest to główny katalog Twojej aplikacji), katalog tests (gdzie siedzą testy). Przykładowa struktura biblioteki z namespacem Foo:
Kod
src/
src/Foo
src/Foo/Parsers
src/Foo/Parsers/HtmlParser
src/Foo/Builder
src/Foo/MenuBuilder


Coś takiego. Mam nadzieję, że załapiesz. Poczytaj sobie poza tym, PSR - warto wiedzieć i wdrażać.


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Crozin
post 8.09.2014, 22:13:29
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. MVC to jedynie wzorzec architektoniczny i nie ma on ścisłej implementacji - w przeciwieństwie do samej jego definicji.
2. Jeżeli chodzi o strukturę plików w projekcie to właściwie nie ma o czym mówić: PSR-0 oraz jego następna PSR-4 właściwie kończą temat.
3. Jeżeli chodzi o implementację autoloadera to rzuć okiem na tego udostępnianego przez Composera (zresztą w ogóle rzuć okiem na to narzędzie). W środowisku deweloperskim właściwie w pełni przejmuje to zadanie od programisty (można by powiedzieć, że jest to najoptymalniejszy autoloader względem czasu programisty), a w środowisku produkcyjnym wygeneruje Ci zoptymalizowany pod względem czasu działania autoloader.

Ten post edytował Crozin 8.09.2014, 22:14:13
Go to the top of the page
+Quote Post
Ultear
post 10.09.2014, 12:33:40
Post #15





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Dziękuje wszystkim za udzielanie się tutaj, będę praktykował standardy narzucane przez PSR, a także zobaczę narzędzie wspomnianie przez @Crozin.

Witam ponownie, by nie zaśmiecać forum piszę tutaj. Mianowicie mam jeszcze jeden problem, napotkałem go przy ładowaniu PDO z SplClassLoader

Kod
Warning: require(C:\WebServ\httpd\mvc\Application\Libs\PDO.php) [function.require]: failed to open stream: No such file or directory in C:\WebServ\httpd\mvc\Application\Libs\SplClassLoader.php on line 152


  1. function __construct(){
  2. $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
  3. try{
  4. $this->db = new PDO($dsn, $this->user, $this->pass, $this->options);
  5. } catch(PDOException $e){
  6. $this->error = $e->getMessage();
  7. }
  8. }


[php][/php]

Ten post edytował Ultear 10.09.2014, 12:45:01
Go to the top of the page
+Quote Post
pedro84
post 10.09.2014, 13:06:34
Post #16





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Msz zagadkę ma dziś smile.gif Poprawiłem Twój kod, ale nie wyjaśnię, spróbuj dojść do tego sam, jak będziesz miał problemy, to pisz, ale spróbuj chociaż.

  1. function __construct(){
  2. $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
  3. try{
  4. $this->db = new \PDO($dsn, $this->user, $this->pass, $this->options);
  5. } catch(\PDOException $e){
  6. $this->error = $e->getMessage();
  7. }
  8. }


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Ultear
post 10.09.2014, 13:44:40
Post #17





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Już widzę wink.gif

Chodzi o \ przy PDO, dziękuje zap moc smile.gif

Z tego co się domyślam jest to nadpisanie przestrzeni nazw, tak?

Niestety wciąż uzyskuje błąd :c

Kod
Warning: require(X:\Server\mvc\Application\Libs\PDO.php) [function.require]: failed to open stream: No such file or directory in X:\Server\blog\Application\Libs\SplClassLoader.php on line 152

Fatal error: require() [function.require]: Failed opening required 'X:\Server\mvc\Application\Libs\PDO.php' (include_path='.;C:\php\pear') in X:\Server\mvc\Application\Libs\SplClassLoader.php on line 152


  1. function __construct(){
  2. $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
  3. try{
  4. $this->db = new \PDO($dsn, $this->user, $this->pass, $this->options);
  5. } catch(\PDOException $e){
  6. $this->error = $e->getMessage();
  7. }
  8. }


Ten post edytował Ultear 10.09.2014, 13:45:04
Go to the top of the page
+Quote Post
pedro84
post 10.09.2014, 13:44:41
Post #18





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


Nie nadpisanie, ale przestrzeń globalna: http://php.net/manual/en/language.namespaces.global.php.


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Ultear
post 10.09.2014, 13:59:28
Post #19





Grupa: Zarejestrowani
Postów: 52
Pomógł: 3
Dołączył: 9.12.2013

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


Wciąż mam problem, pomimo dodania \ wciąż autoloader chce mi czytać z Libsów
Go to the top of the page
+Quote Post
pedro84
post 10.09.2014, 14:05:49
Post #20





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

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


A Ty coś ten autoloader modyfikowałeś? Jeśli tak, wklej go tutaj, aczkolwiek wszystko powinno działać.


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 25.04.2024 - 03:04