Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odwołanie do objektu klasy jak do funkcji
Forum PHP.pl > Forum > PHP
golaod
Jak w temacie. Szukałem jakiegoś interfejsu i niestety nie znalazłem.
Potrzebuje uzyskać coś takiego (dla tych, co nie zrozumieli tematu):
  1. class A {
  2.  
  3. public function funkcja_do_ktorej_wpada_argument_z_odwolania( $arg = '' ) {
  4. # i tutaj cos sobie robie
  5. }
  6.  
  7. }
  8. $class = new A();
  9. $class('view'); #np.

Czy jest coś takiego możliwe z wyłączeniem oczywiście zastosowania zwykłej funkcji lub funkcji anonimowej ?
cojack
call_user_func
golaod
Cytat(cojack @ 20.08.2009, 10:25:36 ) *

Mam nadzieje, że to żart albo ja po prostu nie zrozumiałem tej wspaniałej porady.
cojack
No ja stawiam na drugą opcję, albo ja Ciebie nie zrozumiałem.
golaod
To przypatrz się mojemu przykładowi który podałem. Ma mało wspólnego z tym, co ty mi dałeś.
dr_bonzo
@golaod: twoj przyklad jest mega niejasny

masz obiekt
$class
to mozesz na nim tylko wywlac metody

$class->costam($x);

i nie wiem czym jest funkcja_do_ktorej_wpada_argument_z_odwolania ('costam', czy $x)
i to samo z $arg - co tu ma wejsc.

moze ci o __call() chodzilo?
ucho
Przeciążenie operatora "()" chyba tylko w c++ jest możliwe, jako funktory w php się funkcje anonimowe stosuje.
golaod
Z igły widły robić gdy przykład jest tak prosty.
Skoro jest napisane wywołanie objektu jak funkcji to czemu mam wywołać $class->costam() skoro właśnie chce mieć możliwość $class() i to zostanie dopiero przekierowane do jakiejś głównej funkcji i obsłużone. Chodzi mi o rozwiązanie jak w php 5.3.0 za pomocą __invoke tylko, że nie mogę pracować na php 5.3.0 dlatego szukam innego rozwiązania.
cojack
No niby jak o __call() ? Czegoś takiego nie ma... tworzy chłop obiekt klasy, i że niby do obiektu jak do funkcji podaje nazwę metody? No tego nie widziałem nigdzie, i nawet nie wiem jak by można było coś takiego napisać.
golaod
Cytat(cojack @ 20.08.2009, 11:18:21 ) *
No niby jak o __call() ? Czegoś takiego nie ma... tworzy chłop obiekt klasy, i że niby do obiektu jak do funkcji podaje nazwę metody? No tego nie widziałem nigdzie, i nawet nie wiem jak by można było coś takiego napisać.

Takie coś jest i właśnie nazywa się metodą magiczną zwaną później __invoke. Tyle, że właśnie w php 5.3 ....

Ja zrobiłem takie obejście i choć daje mi to czego oczekiwałem to jednak pozostawia wolną bramkę do stworzenia obiektu bez zwrócenia tej funkcji.
  1. class A {
  2.  
  3. public static $instance = false;
  4.  
  5. private function __construct() {}
  6.  
  7. public static function init() {
  8.  
  9. A::$instance = new A();
  10.  
  11. return create_function( '$arg', 'return A::$instance->m( $arg );' );
  12.  
  13. }
  14.  
  15. public function m( $arg = false ) {
  16.  
  17. var_dump( arg );
  18.  
  19. }
  20.  
  21. }
  22.  
  23. $class = A::init();
  24.  
  25. $class('hello');
phpion
To może metody statyczne? echo Klasa::metoda('parametr')? Wygląda jak wywołanie funkcji poza użyciem :: tongue.gif
golaod
Cytat(phpion @ 20.08.2009, 11:26:13 ) *
To może metody statyczne? echo Klasa::metoda('parametr')? Wygląda jak wywołanie funkcji poza użyciem :: tongue.gif

Właśnie chcę uniknąć wywoływania jawnego metod. Mniejsza z tym dlaczego, po prostu chcę biggrin.gif

Ok trochę się zamotałem jednak udało mi się osiągnąć efekt z obejściem.

  1. class A{
  2.  
  3. private static $instance = false;
  4.  
  5. private function __construct() { }
  6.  
  7. public static function get_instance() {
  8.  
  9. return A::$instance;
  10.  
  11. }
  12.  
  13. public static function init() {
  14.  
  15. A::$instance = new A();
  16.  
  17. return create_function( '$arg', 'return A::get_instance()->m( $arg );' );
  18.  
  19. }
  20.  
  21. public function m( $arg = false ) {
  22.  
  23. echo $arg;
  24.  
  25. }
  26.  
  27. }
  28.  
  29. $class = A::init();
  30.  
  31. $class('hello');
cojack
tam Ci brakuje $ przy var_dump( arg );

Ale to nie do końca działa tak jakbyś chciał, bo za każdym razem będziesz musiał tworzyć nowe metody by wywołać inną funkcję?


BTW ładnie to jest powalone biggrin.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.