Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: funkcja jako zmienna nie dziala
Forum PHP.pl > Forum > PHP
boocheck2
  1. <?
  2.  
  3. class Klasa{
  4. var $zmienna;
  5. }
  6.  
  7. function funkcja(){
  8. print("wywoluje sie!!!");
  9. }
  10.  
  11. $mojaInstancja = new Klasa;
  12. $mojaInstancja->zmienna=funkcja;
  13. $mojaInstancja->zmienna();
  14. print("dlaczego to nie dziala?");
  15.  
  16.  
  17. ?>
Fifi209
Bo to nie javascript tylko php.
classes
boocheck2
  1. <?
  2.  
  3. class Klasa{
  4. var $zmienna;
  5. }
  6.  
  7. function funkcja(){
  8. print("wywoluje sie!!!");
  9. }
  10.  
  11. $mojaInstancja = new Klasa;
  12. $mojaInstancja->zmienna=funkcja;
  13. //$mojaInstancja->zmienna();
  14. print("dlaczego to nie dziala?");
  15.  
  16. $mojaZmienna=funkcja;
  17. $mojaZmienna();
  18. print("a to dziala");
  19.  
  20. ?>


php jednak raczej obsluguje take przypisania:
http://php.net/manual/pl/functions.variable-functions.php

ma ktos inny pomysl dloaczego nie dziala?
piotr94
a nie powinno być =funkcja();
Fifi209
Cytat(piotr94 @ 25.07.2010, 12:52:33 ) *
a nie powinno być =funkcja();

Nie.

@topic
Jak już wspomniałem to nie javascript. Jakby dało się robić tak jak piszesz to w jednym obiekcie miałbyś funkcję a w drugim już nie. smile.gif Poza tym klasy w php5 troszkę inaczej pisze się niż w niższych wersjach.
Zyx
boocheck2 -> a nie zauważyłeś, że istnieje zasadnicza różnica między Twoim zapisem:

  1. $a->foo();


a zapisem z dokumentacji:

  1. $a->$foo()


Ten jeden znak dolara ma kolosalne znaczenie. W dokumentacji jest jasno i wyraźnie napisane, że nazwa funkcji/zmiennej może być odczytana wyłącznie z innej zmiennej, a pole klasy czy element tablicy zmienną nie jest, lecz co najwyżej elementem zmiennej o typie złożonym.

boocheck2
jak to pola nie sa zmiennymi? to zdefiniujmy zmienna. zmienna to takie 'cos' o okreslonym typie (w php to jest luzno kontrolowane) do czego mozna przypisac wartosc i wartosc sczytac (zczytac?). w takim sensie zarowno pole klasy jak i komorka tabeli sa zmiennymi.
Fifi209
Mógłbyś pokombinować z __call()
Zyx
To zdefiniujmy sobie lodówkę jako coś, co pozwala polecieć na księżyc smile.gif. Jak już się bierzesz za definiowanie, definiuj na podstawie tego, co faktycznie ma miejsce, gdyż inaczej taka definicja nie jest nic warta. Wg Twojej zmienną jest nawet zapis 53 - ostatecznie też reprezentuje wartość i ma określony typ.

"Coś" o określonym typie nazywa się "wartością". Zmienną masz zdefiniowaną w gramatyce PHP jako coś o nazwie \$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* . Czy pole obiektu spełnia ten warunek? Nie. Czy element tablicy spełnia ten warunek? Nie. Wprawdzie zmienne, pola obiektów oraz elementy tablic przechowują wartości oraz mają pewne nazwy pozwalające na dobranie się do nich, mają inne właściwości w gramatyce i semantyce języka, więc nie można ich traktować tak samo. Prosty przykład: jeśli wszystkie te rzeczy są zmiennymi, dlaczego nie zadziała poniższy kod:

  1. <?php
  2. $foo = function(){ echo 'foo'; }
  3. $obj = new stdClass;
  4. $obj->bar = function(){ echo 'bar'; }
  5.  
  6. $foo(); // OK
  7. $obj->bar(); // Błąd


Nie zadziała, ponieważ $obj->bar nie jest zmienną, lecz polem obiektu, a tymczasem aby wywołać funkcję anonimową, musi być ona zapisana w zmiennej. Zauważ, że taki zapis jest nawet niejednoznaczny gramatycznie. Przecież w obiekcie może być zarówno pole bar, jak i metoda bar(). Jeśli do pola przypiszemy funkcję anonimową, co wtedy należy wywołać?
boocheck2
no to ja mam teraz lekki metlik bo nie wiem jak zrobic wczytywanie podstron w dosc duzym serwisie.

do tej pory mialem nastepujaace elementy:
- folder z wymiennymi szablonami html, np podstawowy html, i byl to plik ktory byl poprawnym dokumentem html, z wczytanym stylem css itd tylko nie posiadal tresci a jedynie ( w poszczegolnych divach) znaczniki [tresc1], [tresc2] i tak dalej.
- folder z podstronami, zawieral np glowna.php. i tam mialem w kodzie tego pliku utworzenie instancji obiektu typu Podstrona (definicja klasy w zewnetrzym pliku), i wypelnienie jego poszczegolnych pol, np stringa z adresem do szablonu ktorego ta podstrona ma uzywac. nastepnie byly zupelnie poza ta klasa, zewnetrznie, ale w pliku podstrony zdefiniowane funkcje, np <string> wyciagnij_z_bazy_newsy_i_wyswietl(), <string> inna_funkcja(), <string> jeszcze_inna_funkcja(). te funkcje przypisywalem do tablicy ktora byla polem skladowym konkretnego obiektu typu Podstrona, np wlasnie newsy trafialy na pierwsze miejsce w tablicy funkcji podstrony glowna.php
- index.php, ktory bral z $_GET[] zmienna $strona i jesli istnial taki plik w strukturze folderow to go ladowal a jesli nie to wybieral glowna.php. wtedy dzialy sie czary i dzialala funkcja ktora brala z zaincludowanego pliku (uzywalem require) obiekt typu Podstrona, np ten utworzony w glowna.php i wczytywala do stringa szablon ktory ta podstrona uzywala a w miejsce [tresc1] wstawiala to co zwrocila pierwsza funkcja w tablicy funkcji w tym naszym konkretnym przypadku "wyciagnij_z_bazy_newsy_i_wyswietl()", za [tresc2] to co zwrocila druga etc.

i o ile to dzialalo, tj naprawde udawala sie przypisac i odpalic ta funkcje ktora byla w tablicy ktora byla polem w obiekcie typu podstrona, to potem chcialem nie miec w pewnym momencie tablicy takich funkcji ale jeszcze osobno zmienna z funkcja glowna danej podstrony tak zeby w tej, pobrac dane z $_GET[]'a i poodpalac poszczegolne podfunkcje (juz te z tablicy funkcji) z konkretnymi argumentami.

jak to logiczniej podzielic, jesli nie tak?
Fifi209
Zamiast wymyślać koło na nowo zainteresuj się systemami szablonów lub wzorcem MVC, który z resztą bardziej spełni Twoje oczekiwania.

A jeżeli jesteś uparty to próbować możesz na różne sposoby...
  1. <?php
  2.  
  3. class r {
  4.  
  5. private $arr = array();
  6.  
  7. public function __set($name, $val) {
  8. $f_name = substr($val, 0, strpos($val, '('));
  9. $this->arr[$name] = $f_name;
  10. }
  11.  
  12. public function __call($name, $x) {
  13. $f_name = $this->arr[$name];
  14. echo $f_name();
  15. }
  16. }
  17.  
  18. function KAPI() {
  19. return 1;
  20. }
  21.  
  22. $obj = new r;
  23.  
  24. echo 1;
  25.  
  26. $obj->test = 'KAPI();';
  27.  
  28. echo 2;
  29.  
  30. echo $obj->test();
  31.  
  32. echo 3;
  33.  
  34. ?>
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.