Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $tmp = $inst->$funkcja
Forum PHP.pl > Forum > PHP > Object-oriented programming
sikorat
Dzien dobry.
Nazwa katalogu w ktorym znajduje sie pozadany plik php, nazwa tego pliku php, klasy w nim zawartej i metody do wywolania sa przekazywane w zmiennych. W ten sposob chce stworzyc w miare uniwersalny sposob nawigacji programu po swoim kodzie, bez koniecznosci dopisywania kolejnych odwolan gdy bede dodawac nowe moduly.

Problem polega na tym ze wywołanie metody przez przekazanie jej nazwy w zmiennej
  1. <?php
  2. $tmp = $inst->$funkcja
  3. ?>
nie działa.

Poniżej troszke więcej kodu.

  1. <?php
  2. //tablica module odpowiada istniejacym folderom
  3. $this->module = array(
  4. 1=>'Deliverers',
  5. 2=>'Parametrisation',
  6. 3=>'Customers'
  7. );
  8.  
  9. //tablica act odpowiada nazwom plikow php w danym module
  10. $this->act = array(
  11. 11=>'MainDeliverers',
  12. 21=>'MainParametrisation'
  13. );
  14.  
  15. //ogladacz strony w trakcie jej przegladania i wciskania guzikow zapisuje do sesji
     identyfikator module-czyli nazwy katalogu i id act czyli nazwy pliku i taki plik zostaje zainkludowan
    y do aktywnego skryptu
  16. $include_file = MAIN_FOLDER.SLASH.$this->module[$_SESSION['module']].SLASH.$this->act[$_SESSION['act']].'.php';
  17. include($include_file);
  18. // nazwa klasy jest u mnie zawsze taka sama jak nazwa pliku php
  19. $klasa  = $this->act[$_SESSION['act']];
  20. //nazwa funkcji jest u mnie zawsze taka sama jak nazwa klasy + przedrostek
  21. $funkcja = FNC_PREFIX.$klasa.'()';
  22. //tu jeszcze dziala - wchodzi do konstrukta
  23. $inst = new $klasa;
  24. //tu juz nie dziala i zwraca komunikat
  25. $tmp = $inst->$funkcja;
  26. return $tmp;
  27. ?>


Treść zwracanego komunikatu brzmi tak:
Notice: Undefined property: MainDeliverers::$FncMainDeliverers() in \functionality\UrlNavigator.php on line 35
gdzie MainDeliverers:: pochodzi ze zmiennej $inst, a $FncMainDeliverers() ze zmiennej $funkcja.

starałem się rozwiązać problem przez
  1. <?php
  2. $tmp = call_user_func(array($klasa, $funkcja));
  3. ?>
, ale nie działa i przez
  1. <?php
  2. $tmp = eval($inst->$funkcja);
  3. ?>
, ale tez nie dziala.
moja uwage zwrocila tez obecnosc znaku $ w nazwie funkcji w zwracanym przez przegladarke komunikacie.

czy ktos moze mi pomoc w rozwiazaniu tego problemu?

pozdrawiam
LEW21
Zamiast robić tak:
  1. <?php
  2. $funkcja = FNC_PREFIX.$klasa.'()';
  3. (...)
  4. $funkcja
  5. ?>

Zrób to tak:
  1. <?php
  2. $funkcja = FNC_PREFIX.$klasa;
  3. (...)
  4. $funkcja()
  5. ?>
sikorat
Działa!
Wieeelkie dzieki!!!!!!!!
tomeksobczak
http://pl2.php.net/call_user_func
NuLL
  1. <?php
  2. $inst->{$funkcja}();
  3. ?>
LEW21
@tomeksobczak: Po co kombinować z produkowaniem i przekazywaniem arrayów do call_user_func jak można to zrobić dużo prościej?

@NuLL: Mam nadzieję że o tym wiesz, ale te nawiasy klamrowe nie są tutaj potrzebne tongue.gif
mysz
Cytat(LEW21 @ 18.07.2007, 11:28:33 ) *
@tomeksobczak: Po co kombinować z produkowaniem i przekazywaniem arrayów do call_user_func jak można to zrobić dużo prościej?


Bo prościej nie znaczy prościej? ;)
Po kilku miesiącach użycie call_user_func() będzie znacznie czytelniejsze, mniej mylące.

Cytat
@NuLL: Mam nadzieję że o tym wiesz, ale te nawiasy klamrowe nie są tutaj potrzebne :P


Do 'nadmiarowych' klamr czy też funkcji jeszcze przywykniesz. Przyda się projekt nad którym siedzi się dużej niż kilka popołudni, tworzony w np. 5 osób.
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.