Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z klasą "Moduł", Problem w 'myśleniu obiektowym' czy w kodowaniu?
zlw
post
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 30.04.2007
Skąd: WWA

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


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ę"
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Foxx
post
Post #2





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

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


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

Ten post edytował Foxx 13.11.2007, 18:14:39
Go to the top of the page
+Quote Post
Helios
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.07.2006

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


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.

Ten post edytował Helios 14.11.2007, 01:52:37
Go to the top of the page
+Quote Post
Whisller
post
Post #4





Grupa: Zarejestrowani
Postów: 77
Pomógł: 5
Dołączył: 29.03.2006
Skąd: Poznań

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


SPL i DirectoryIterator
Go to the top of the page
+Quote Post

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: 23.08.2025 - 19:37