Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: {<|?|>} Wywoływanie klasy z argumentami...
Forum PHP.pl > Forum > PHP
ignition
Chciałbym wywołać klasę z nie określoną ilością argumentów (po przecinku:P), ale nie znalazłem żadnej funkcji, która by to zrobiła. Zrobiłem więc coś takiego:
  1. <?php
  2. $classValue = &#092;"lato, jesień, zima, wiosna\";
  3. $v = explode( ',', $classValue );
  4. $class = new jakasklasa( @$v[0], @$v[1], @$v[2], @$v[3], @$v[4], @$v[5], @$v[6], @$v[7], @$v[8], @$v[9] );
  5. ?>


...ale to ^ mi się za bardzo nie podoba. Czy da się to jakoś krócej zrobić??
scanner
A że tak z ciekawości zapytam.. co ta klasa robi, że nie wiesz ile (i czy w ogóle) parametrów do niej prześlesz?
netzah
uzyj func_get_args()
ignition
Tworzę klasę, która w łatwy sposób zarządzała by uruchamianiem innych klas, więc potrzebuje szybkiego sposobu, aby do nowych klas dodano (jeśli są ) jakieś argumenty.
Po drugie nie mogę wykorzystać wywoływania klasy w taki sposób $x = new x(a,b,c...), ponieważ robi to skrypt. Po trzecie nie wiem ile argumentów ma być dodanych dla danej klasy.

Nie mogę uzyć func_get_args() ponieważ to nie konstruktor wywoływanej klasy ma sprawdzać ile jest argumentów, a po drugie wolał bym aby sprawdzanie ile jest argumentów było wykonywane na zewnątrz klasy.
netzah
ok, sory. w takim razie ja nie wiem o co chodzi aarambo.gif
ignition
Po prostu chcę aby sprawdzanie ile argumentów ma być nadanych do klasy było sprawdzane nie wewnątrz konstruktora wywołanej klasy, lecz "na zewnątrz", czyli w skrypcie który będzie uruchamiał daną klasę (coś podobnego u góry) tongue.gif
matid
Sam się kiedyś nad tym głowiłem i nawet wypisywałem pytania na forum. Najlepszym rozwiązaniem tego problemu jest tworzenie takich klas, które nie wymagają argumentów, a zamiast tego tworzenie metody, np. setup(), która daną instancję skonfiguruje.

Rozwiązaniem nieco mniej 'pięknym' jest taki kod:
  1. <?php
  2.  
  3. $classValue = 'lato, jesień, zima, wiosna';
  4. $arrValues = explode( ', ', $classValue );
  5. $strCommand = '$objClass = new NazwaKlasy( ';
  6. foreach( $arrValues as $strValue )
  7. {
  8. $strCommand .= ''' . $strValue . '', ';
  9. }
  10. $strCommand = substr( $strCommand, 0, -2 ) . ' );';
  11. eval( $strCommand );
  12. ?>
ignition
Wyskakuje m i błąd:
Parse error: syntax error, unexpected ')' in d:\program files\wamp\www\iVolutio\start.php(23) : eval()'d code on line 1
matid
Cytat(ignition @ 2004-10-13 17:43:44)
Wyskakuje m i błąd:
Parse error: syntax error, unexpected ')' in d:\program files\wamp\www\iVolutio\start.php(23) : eval()'d code on line 1

To była drobna pomyłka przy nazewnictwie zmiennych. Teraz powinno być ok.
Sh4dow
ignition a moze bys posiedzial dluzej z karteczka i olowkiem i przemyslal budowe klas ?
Ni cholery nie zrozumialem z twoich pierwszych wypowiedzi. Zawsze masz do dyspozycji eval, mozesz do wszystkich klas agrumenty przekazac w tablicy. mozesz wywolac klase bez argumentow, pozniej wykonaj metody do odpowiedniej konfiguracji.
Metod jest wiele.
a tak wogole, dlaczego konstruktor klasy wykonywanej nie ma wiedziec jakie argumenty wpisales przy wywolywaniu ? Chyba ze ja zle rozumuje.
Napisales ze zewnetrzna klasa ma wiedziec ile jest argumentow, ale wewnetrzna nie ma sobie tego wykrywac. Wiec po cholere przekazujesz jej argumenty jak o nich wiedziec nie ma ?
Wytlumacz jakos logicznie co ty wogole chcesz ?
ignition
Czy dało by się zrobić o coś takiego:
  1. <?php
  2.  
  3. class a
  4. {
  5. function __construct( $a, $b, $c, $d )
  6. {
  7. print &#092;"$a<BR>$b<BR>$c<BR>$d\";
  8. }
  9.  
  10. function test()
  11. {
  12. print 'test';
  13. }
  14. }
  15.  
  16. class blabla
  17. {
  18. public $cValue = 'lato, jesień, zima, wiosna';
  19.  
  20. function __construct()
  21. {
  22.  $jakasNazwaKlasyKtóraBędzieSięZmieniać = $this->classValue( $this->cValue, a);
  23. }
  24.  
  25. function classValue( $classValue, $className )
  26. {
  27. $arrValues = explode( ', ', $classValue );
  28.  
  29. $strCommand = 'new'.&#092;" $className \".'( ';
  30. foreach( $arrValues as $strValue )
  31. {
  32. $strCommand .= ''' . $strValue . '', ';
  33. }
  34. $strCommand = substr( $strCommand, 0, -2 ) . ' );';
  35.  
  36. return eval( $strCommand );
  37. }
  38. } 
  39.  
  40. ?>

...klasa się ładuje, ale nie wiem kto jest obiektem klasy;
DeyV
Z tego co wiem, nie ma możliwości sprawdzenia, ile parametrów wymaga lub przyjmuje jakaś metoda.
Jednak takie rozwiązanie mi również wydaje się błędne już z samego założenia.

Nie lepiej jest ustalić wspólny interfejs dla danych klas (w końcu, jeśli chcesz z nich korzystać w ten sposób, to musi je coś łączyć...) i potem niezależnie od tego, instancją jakiej klasy będzie nasz obiekt, zawsze będziemy mogli sprawdzić, czy dziedziczy z wybranego przez nas interfejsu.
Jeśli tak - będziemy dokładnie wiedzieć, jakie parametry i w jakiej kolejności należy mu dostarczyć.

W manualu jest więcej przykładów na temat tworznia interfejsów (oczywiście mowa o php5) ale jeśli będziesz potrzebował jeszcze jakiś przykład - pisz.
ignition
No tak ale jest jedno ale. Po pierwsze jeżeli chcę stworzyć klasę, która by zarządzała innymi klasami to czy każda zarządzana klasa powinna dostawać do konstruktora jeden argument w formie tablicy? Oczywiście, że nie ponieważ większość (większość w znaczeniu skrypty udostępnione w necie jak np. adodb) klas nie dostaje jednego argumentu (w formie tablicy), tylko kilka. Po drugie interfejsy są jak na taki typ klasy nie rozsądne, ponieważ chcę różne ładować klasy (nie tylko tworzone przezemnie), które mogą nie być tworzne myślą o tym systemie tongue.gif
Sh4dow
Co ty chcesz zrobic ? klase ktora uruchamia dowolna klase z nieba wzieta czy chcesz zrobic klase ktora bedzie posiadac jakis swoj standart i wedlog standartu pisac potrzebne klasy.
Niestety nie widze jakiegokolwiek logicznego sensu w tym co chcesz zrobic. Zawsze mozesz probowac skanowac pliki klas i wyszukiwac ilosc argumentow. ale moim zdaniem jest to juz chyba jakas paranoja.
Polecam przeanalizowac ponownie projekt klasy.

Co do ADOdb to inicjuje sie go funkcja ktora oddaje obiekt smile.gif
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.