Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PSR-0, SplClassLoader
marcinek37
post 25.09.2014, 11:49:27
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


W momencie, gdy aplikacja staje się coraz większa, trzeba zastosować technikę wygodnego ładowania klas.
Przeczytałe na forum, że najlepszym rozwiązaniem jest użycie klasy SplClassLoader, zgodnej ze standardami PSR-0.
Czy coś od tego czasu się zmieniło?

Utworzyłem zatem w katalogu głównym na serwerze plik SplClassLoader.php, w którym wkleiłem kod pochodzący ze strony: https://gist.github.com/jwage/221634#file-s...loader-php-L142

Zawartość pliku index.php wygląda tak:
  1. <?php
  2. include_once('SplClassLoader.php');
  3.  
  4. $loader = new SplClassLoader('classes', __DIR__);
  5. $loader->register();
  6.  
  7. $a = new classes\klasa();


Utworzyłem w tym katalogu kolejny katalog o nazwie "classes", a w nim umieściłem plik klasa.php z prostą klasą.
Mimo to pokazuje się błąd:
Fatal error: Class 'classes\klasa' not found in D:\xampp\htdocs\nauka\index.php on line 8

Nie wiem, w czym tkwi problem, a podejrzewam, że to drobnostka.
Go to the top of the page
+Quote Post
Pyton_000
post 25.09.2014, 11:53:36
Post #2





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

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


Zainteresuj się tym:
https://getcomposer.org/doc/01-basic-usage.md#autoloading

PS.W tamtym kodzie co masz separatorem jest _ a nie \

Ten post edytował Pyton_000 25.09.2014, 11:56:08
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 12:15:04
Post #3





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Poprzednie rozwiązanie jest wg mnie prostsze, bo nie wymaga dodatkowego pliku composer.json, którego istoty kompletnie nie rozumiem - napotkałem go w kilku skryptach

W jaki sposób poprawić kod z pierwszego posta, aby zaczął działać?
Go to the top of the page
+Quote Post
Pyton_000
post 25.09.2014, 12:21:11
Post #4





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

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


Przecież Ci napisałem użyj _ w nazwie klasy
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 12:24:03
Post #5





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Wg Twoich zaleceń zmieniłem kod na:
  1. <?php
  2. include_once('SplClassLoader.php');
  3.  
  4. $loader = new SplClassLoader('classes', __DIR__);
  5. $loader->register();
  6.  
  7. $a = new classes_klasa();


i nadal nie działa.
Tutaj: http://forum.php.pl/index.php?showtopic=23...toload&st=0
w poście #8 używa się \, a nie _
Go to the top of the page
+Quote Post
Pyton_000
post 25.09.2014, 12:34:14
Post #6





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

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


Zrób sobie var_dump($fileName) w loadClass
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 12:40:26
Post #7





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Twoje polecenie nie jest dość precyzyjne. W klasie SplClassLoader w metodzie loadClass zmienna $fileName występuje kilka razy.
Poza tym, skoro to taka popularna klasa, to chyba nie powinniśmy szukać w niej błędów, a raczej w kodzie, jaki przedstawiłem. Coś pokręciłem, ale nie wiem co.
W temacie, o jakim pisałem wcześniej, innemu użytkownikowi klasa działała bez zarzutu.
Go to the top of the page
+Quote Post
destroyerr
post 25.09.2014, 13:05:36
Post #8





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


No to pokaz jeszcze jak wyglada plik classes/klasa.php
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 13:06:15
Post #9





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


klasa.php
  1. <?php
  2.  
  3. class klasa{
  4. function __construct(){
  5. echo'test';
  6. }
  7. }
Go to the top of the page
+Quote Post
phpion
post 25.09.2014, 13:10:24
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie widzisz różnicy?
  1. $a = new classes_klasa();

  1. class klasa{
Go to the top of the page
+Quote Post
zidek
post 25.09.2014, 13:11:08
Post #11





Grupa: Nieautoryzowani
Postów: 50
Pomógł: 2
Dołączył: 28.05.2013

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


Cytat(marcinek37 @ 25.09.2014, 14:06:15 ) *
klasa.php
  1. class klasa{

tutaj masz błąd wink.gif
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 13:15:08
Post #12





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Ale tak "classes_klasa()" kazał mi tę klasę nazwać @Pyton. W oryginale jest inaczej, przeczytajcie pierwszy post, tam wszystko wyjaśniłem.
Go to the top of the page
+Quote Post
destroyerr
post 25.09.2014, 13:51:23
Post #13





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Poczytaj o przestrzeniach nazw w php bo moim zdaniem nie ma sensu żeby z nich korzystać a nie mieć o nich pojęcia.
Go to the top of the page
+Quote Post
marcinek37
post 25.09.2014, 14:10:10
Post #14





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Mam rozwiązanie.

Index.php
  1. <?php
  2. require_once("SplClassLoader.php");
  3. $loader = new SplClassLoader('classes', __DIR__);
  4. $loader->register();
  5.  
  6. use classes\Klasa;
  7.  
  8. $r = new Klasa();


classes/Klasa.php:
  1. <?php
  2. namespace classes;
  3.  
  4. class Klasa
  5. {
  6. public function __construct()
  7. {
  8. echo __CLASS__ . " constructer!";
  9. }
  10. }
Go to the top of the page
+Quote Post
freemp3
post 25.09.2014, 14:19:20
Post #15





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

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


Możesz również pominąć use i napisać tak:
  1. $r = new classes\Klasa();


Kod z pierwszego postu nie zadziałał ponieważ w pliku z klasą nie zadeklarowałeś przestrzeni nazw:
  1. namespace classes;


--------------------
Niemożliwym jest stworzenie czegokolwiek idiotoodpornego, ponieważ idioci są wyjątkowo pomysłowi.

https://www.aroch.pl
https://themeforest.net/user/aroch
https://www.astroblog.aroch.pl
https://www.4geeks.pl
Go to the top of the page
+Quote Post

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: 5.07.2025 - 06:44