Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Dynamiczne tworzenie metod
Forum PHP.pl > Forum > PHP > Object-oriented programming
Crozin
Mam sobie jakas klase (oczywiscie to tylko schemat tongue.gif):
  1. <?php
  2. class Cos{
  3. //pola
  4.  
  5. public function a(){}
  6. public function b(){}
  7. public function c(){}
  8. public function d(){}
  9. //i jeszcze kilka...
  10. }
  11. ?>

zawartosc metod jest dosc dluga, a musze teraz dodac jeszcze kilka/kilkanascie, nie chce robic klasy ktora bedzie zbym dluga (pod wzgledem linijek) głównie za wzgledu na czytelnosc... bardzo wyglodnym rozwiazaniem bylo by zapisanie kilku metod w osobnych plkach, jednak powstaje tu pewnen probelm :/ Nie znalazlem niczego co by umozliwiało zrobienie czegos takiego:
  1. <?php
  2. class Klasa{
  3. //pola
  4.  
  5. public function a(){}
  6. public function b(){}
  7. public function c(){}
  8.  
  9. include('metodaD.php'); 
  10. }
  11. ?>

przeszukalem manual (Function Handling Functions) ale niczgo nie znalazlem... moglbym robic to w ten sposob:
  1. <?php
  2. //....
  3. public function d(){
  4. include('metodaD.php');
  5. }
  6. ?>
ale to jest ostateczne rozwiazanie smile.gif

Tak wiec... czy istnieje sposob na "dynamiczne" stworzenie, ale wczytanie z innego pliku metod?
LBO
Po co? Klasa, jako obiekt służy do enkapsulacji - trzymania w jednym miejscu powiązanych ze sobą danych. To samo tyczy się metod. Nie wiem po co chcesz to dzielić na pliki. Mija się to z filozofią OOP.


edit:

Co do pytania. Można tak zrobić:
Plik: Klasa.php
  1. <?php
  2.  
  3. class Klasa
  4. {
  5. public function metodaB($hello) {
  6. $this->hello = $hello;
  7. include('metodaB.php');
  8. }
  9. }
  10. $kl = new Klasa();
  11. $kl->metodaB('hello world!');
  12. ?>

Plik: metodaB.php
  1. <?php
  2. print($this->hello);
  3. ?>


Uruchomienie kodu w pliku Klasa.php spowoduje, wyświetlenie sie na "hello world". Czyli tak jak chciałeś.
Przy odrobinie zawzięcia i metod magicznych, można by to zautomatyzować.

edit:

Pamiętaj, że uruchomienie pliku metodaB.php nie w kontekście obiektu, spowoduje błąd parsera.

edit:

Oh, przepraszam, źle doczytałem Twoje pytanie. Jeżeli chodzi Tobie o dzielenie definicji klasy na pliki, to nie da rady. W manualu powinno być napisane, przynajmniej w User Notes.
Sedziwoj
Jest fajna zasada, bierze się karteczkę 10cm x 10cm i opisuje się na niej klasę, jak się nie mieści co ma robić, to znaczy że trzeba rozbić na więcej.
(opis.length != kodu.length tongue.gif )

EDIT:
Czyli jak masz tyle metod, to może masz źle zbudowaną klasę...
Jabol
Tyle, że ta koncepcja nie akceptuje elementów prywatnych. I nie możesz w ten sposób implementować metod magicznych, bo php tego nie rozpozna. Nie będzie również działać z interfejsami/całym zaawansowanym OOP. Pozdrawiam.
  1. <?php
  2.  
  3. function XXXtest($self)
  4. {
  5. print $self->var;
  6. }
  7.  
  8. $XXXMethodsList=array(
  9. 'test'=>'XXXtest'
  10. );
  11.  
  12. class XXX
  13. {
  14. public $var='XXX';
  15. public function __call($_fname, $_fargs)
  16. {
  17. global $XXXMethodsList;
  18. if(!is_array($_fargs)) $_fargs=array();
  19. array_unshift($_fargs, &$this);
  20. if(isset($XXXMethodsList[$_fname])) return call_user_func_array($XXXMethodsList[$_fname], $_fargs);
  21. }
  22. }
  23.  
  24. $test=new XXX();
  25. $test->test();
  26.  
  27. ?>
dr_bonzo
Cytat
zawartosc metod jest dosc dluga, a musze teraz dodac jeszcze kilka/kilkanascie, nie chce robic klasy ktora bedzie zbym dluga (pod wzgledem linijek) głównie za wzgledu na czytelnosc


1. Wyglada na to ze klasa ma za duzo zobowiazan ("bierze się karteczkę 10cm x 10cm i opisuje się na niej klasę, jak się nie mieści co ma robić, to znaczy że trzeba rozbić na więcej.")

2. Od tego masz edytor zeby latwo sie po kodzie skakalo; lista metod, skok do definicji zaznaczonej metody itd
Crozin
trudno winksmiley.jpg
pozostaje to przemyslec jeszcze raz i najwzej napisac od nowa... biggrin.gif
DeyV
zamiast rozbijać klasę na części, zdecydowanie lepiej jest skorzystać z dziedziczenia, i w klasach potomnych uzupełniać metody, w zależności od ich funkcji.

Jest to nie tylko o wiele czytelniejsze, ale też zgodne z paradygmatem OOP.
Sedziwoj
Cytat(DeyV @ 12.04.2007, 09:36:01 ) *
zamiast rozbijać klasę na części, zdecydowanie lepiej jest skorzystać z dziedziczenia, i w klasach potomnych uzupełniać metody, w zależności od ich funkcji.

Jest to nie tylko o wiele czytelniejsze, ale też zgodne z paradygmatem OOP.


A na czym rozbicie polega Twoim zdaniem? Bo jak dla mnie to właśnie wykorzystanie dziedziczenia kompozycji/agregacji itp., bo bez sensu jest rozbijać kod na dwie klasy bez rozplanowania co one mają robić. (bo jak sie nie zrobi logicznego rozbicia, tylko techniczne to nic nie zmienia)
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.