Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PSR-0, SplClassLoader
Forum PHP.pl > Forum > PHP
marcinek37
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.
Pyton_000
Zainteresuj się tym:
https://getcomposer.org/doc/01-basic-usage.md#autoloading

PS.W tamtym kodzie co masz separatorem jest _ a nie \
marcinek37
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ć?
Pyton_000
Przecież Ci napisałem użyj _ w nazwie klasy
marcinek37
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 _
Pyton_000
Zrób sobie var_dump($fileName) w loadClass
marcinek37
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.
destroyerr
No to pokaz jeszcze jak wyglada plik classes/klasa.php
marcinek37
klasa.php
  1. <?php
  2.  
  3. class klasa{
  4. function __construct(){
  5. echo'test';
  6. }
  7. }
phpion
Nie widzisz różnicy?
  1. $a = new classes_klasa();

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

tutaj masz błąd wink.gif
marcinek37
Ale tak "classes_klasa()" kazał mi tę klasę nazwać @Pyton. W oryginale jest inaczej, przeczytajcie pierwszy post, tam wszystko wyjaśniłem.
destroyerr
Poczytaj o przestrzeniach nazw w php bo moim zdaniem nie ma sensu żeby z nich korzystać a nie mieć o nich pojęcia.
marcinek37
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. }
freemp3
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;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.