Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> {<|?|>} Wywoływanie klasy z argumentami..., ...z nieznaną ilością argumentów?...
ignition
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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ć??
Go to the top of the page
+Quote Post
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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?


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
netzah
post
Post #3





Grupa: Zarejestrowani
Postów: 109
Pomógł: 1
Dołączył: 19.03.2004

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


uzyj func_get_args()
Go to the top of the page
+Quote Post
ignition
post
Post #4





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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.

Ten post edytował ignition 12.10.2004, 14:10:30
Go to the top of the page
+Quote Post
netzah
post
Post #5





Grupa: Zarejestrowani
Postów: 109
Pomógł: 1
Dołączył: 19.03.2004

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


ok, sory. w takim razie ja nie wiem o co chodzi aarambo.gif
Go to the top of the page
+Quote Post
ignition
post
Post #6





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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

Ten post edytował ignition 13.10.2004, 17:14:56
Go to the top of the page
+Quote Post
matid
post
Post #7





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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. ?>


Ten post edytował matid 13.10.2004, 18:32:54
Go to the top of the page
+Quote Post
ignition
post
Post #8





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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
Go to the top of the page
+Quote Post
matid
post
Post #9





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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.
Go to the top of the page
+Quote Post
Sh4dow
post
Post #10





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


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 ?


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
ignition
post
Post #11





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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;

Ten post edytował ignition 14.10.2004, 11:17:26
Go to the top of the page
+Quote Post
DeyV
post
Post #12





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
ignition
post
Post #13





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 14.06.2004

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


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

Ten post edytował ignition 14.10.2004, 14:43:33
Go to the top of the page
+Quote Post
Sh4dow
post
Post #14





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


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


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 10:20