Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klasą "Moduł"
Forum PHP.pl > Forum > PHP > Object-oriented programming
zlw
Witam, właśnie (od 2 dni) zacząłem swą "przygodę z programowaniem obiektowym" i na początek postanowiłem napisać sobie class'ę wczytywania modułów. Oto kod:


  1. <?php
  2. class Module
  3.  {
  4. public $modules_dir;
  5. public $module_name;
  6. public $file_list;
  7.  
  8.  public function loadModule()
  9. {
  10. if(file_exists($this->modules_dir.'/'.$this->module_name))
  11.  {
  12. if(strpos($this->file_list, ';'))
  13.  {
  14.  $this->file_list = explode(';', $this->file_list);
  15.  $num_file_list  = count($this->file_list);
  16.  }
  17.  
  18. for($i = 0; $i = $num_file_list; $i++)
  19.  {
  20. if(file_exists($this->modules_dir.'/'.$this->module_name.'/'.$this->file_list[$i]))
  21.  {
  22. require_once($this->modules_dir.'/'.$this->module_name.'/'.$this->file_list[$i]);
  23. return 'ok';
  24.  }
  25. else
  26.  {
  27. return "nie ok";
  28. }
  29.  }
  30.  
  31.  }
  32. else
  33.  {
  34.  return 'Katalog nie istnieje';
  35.  }
  36. }
  37.  }
  38.  
  39. $object = new Module();
  40. $object->modules_dir = '../../modules';
  41. $object->module_name = 'Article';
  42. $object->file_list  = 'index.php;html.php';
  43. $object->loadModule();
  44. ?>


Problem w tym, że wywala mi błąd:
Kod
Warning: Module::require_once(../../modules/Article/) [function.Module-require-once]: failed to open stream: No such file or directory in C:\wamp\www\reiki\includes\classes\class.Modules.php on line 33

Fatal error: Module::require_once() [function.require]: Failed opening required '../../modules/Article/' (include_path='.;C:\php5\pear') in C:\wamp\www\reiki\includes\classes\class.Modules.php on line 33


Nie wiem czy błąd leży gdzieś w 'obiektowości' ($this, new Object itp.) czy może (oby) gdzieś w "zwykłym" kodzie PHP, tak czy inaczej - proszę o pomoc.
Przy okazji prosiłbym o ocenę klasy - czy waszym zdaniem dobre podejście do problemu czy to tylko "strukturalny kod objęty w klasę"
Foxx
A nie powinno być:
  1. <?php
  2. // zamiast
  3. for($i = 0; $i = $num_file_list; $i++)
  4. // tak:
  5. for($i = 0; $i < $num_file_list; $i++)
  6. // ?
  7. ?>


count zwróci Ci liczbę elemetów ale tablica jest indeksowana od zera, błąd jest stąd że przez to próbujesz includować plik, którego nie ma
Helios
Blad podstawowy taki jak poprzednik napisal. Od siebie dodam, ze ta metoda nigdy Ci nie zadziala, jezeli bedzie w srodku wykonywania petli zwracac jakas wartosc (return) - bo return automatycznie konczy wykonywanie metody w tym przypadku przerywa takze wykonywanie petli.
Staraj sie udostepniac spojny interfejs uzytkownikom klasy i nie dawac im bezposredniego dostepu do skladowych klasy (zobacz hermetyzacja). Czyli dostep do skladowych jest mozliwy dzieki udostepnionemu interfejsowi, uzytkownika nie interesuje sposob implementacji. Osiagniesz to ustawiajac skladowe jako prawatne. W tym konkretnym przypadku powinno to sie odbywac przez metody akcesory (udostepnione publicznie): setModule(string $moduleName), setFilesPath(string $filesPath), setFilesArray(array $filesArray) itd. Moze to wydawac sie bez sensu ale oczywiscie nie jest go pozbawione.
Np. gdybys chcial uniemozliwic wpisywanie znakow ./ ../ do nazw plikow za kazdym razem musialbys uruchamiac mechanizm sprawdzajacy/usuwajacy te znaki z ciagu a pozniej metode klasy ladujace dane pliki. Doszloby do powielania kodu a taki mechanizm mozesz zaimplementowac we wnetrzu klasy i masz pewnosc, ze ktos nie przypisze na sztywno nazw plikow zawierajacych te znaki. Mechanizm znajduje sie w jednym miejscu i jest wywolywany przy kazdej probie przypisania wartosci do skladowej.

W Twojej klasie powinna byc mozliwosc dodania jednego pliku do listy (metoda dodaje do listy nazwe pliku), dodania ciagu (plik;plik - ta metoda powinna zajac sie parsowaniem ciagu do tablicy) albo samej tablicy (metoda dolacza tablice do tablicy plikow w klasie). Oddciazasz w ten sposob zadania metody loadModules. W setModule mozesz zaimplementowac od razu mechanizm sprawdzania czy plik istnieje i ewentualnie rzucac wyjatek.

Jak widzisz same plusy z takiego podejscia do sprawy, zamiast udostepniania mozliwosci przypisywania wartosci do skladowych z zewnatrz - na sztywno.

Mozesz takze pomyslec o dodaniu obslugi bledow - w PHP 5 - patrz wyjatki.
Whisller
SPL i DirectoryIterator
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.