Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $var = funkcja() przed jej zdefiniowaniem
Forum PHP.pl > Forum > PHP
MESSIAH :)
Czy moze mi ktos wytlumaczyc dlaczego w PHP czasem definiuje sie funkcje w zmiennej przed jej zaistnieniem w kodzie?
Przyklad:
  1. $Id = "xxx";
  2. $Pw = "zzz";
  3.  
  4. $var = gettext($Id, $Pw);
  5.  
  6. return $var;
  7.  
  8. function gettext($Id, $Pw)
  9. {
  10. ...
  11. return $var;
  12. }


Wedlug mnie powinno byc odwrotnie ze najpierw funkcja a pozniej przypisanie funkcji do zmiennej. Czy taki kod ma sens:

  1. $Id = "xxx";
  2. $Pw = "zzz";
  3.  
  4. function gettext($Id, $Pw)
  5. {
  6. ...
  7. return $var;
  8. }
  9.  
  10. $var = gettext();
  11.  
  12. return $var;
nospor
Cytat
dlaczego w PHP czasem definiuje sie funkcje w zmiennej przed jej zaistnieniem w kodzie?

Bo mozna.
MESSIAH :)
Ale czy to ma jakies sensowne wytlumaczenie? Czy poprostu jakis blad kompilatora? Chyba czytelniej jest definiowac po kolei wszystko niz pozniej szukac krowy w polu Bog wie gdzie i w jakim pliku.
nospor
Niektorzy lubia definiowac funkcje na dole i tyle wink.gif

Poza tym teraz juz nie pisze sie strukturalnie tylko w klasach - a tam to ma juz inny sens.
MESSIAH :)
Jak widze najwieksze firmy potrafia pisace strukturalnie gdyz ten kod wyzej pochodzi z oficjalnego repozytorium duzej swiatowej firmy.
nospor
Jak to mowia: jedzmy gowno, miliony much nie moze sie mylic wink.gif

Do wiekszosci normalnych firm, jak nie znasz obiektowki to raczej mozesz nawet nie startowac. Ale jak wolisz celowac w te pare firm, ktore leca jeszcze strukturalnie, to oczywiscie nikt ci nie broni smile.gif
Tomplus
Dlaczego uważasz, że to błąd parsera skoro jest to element który jest wytłumaczony nawet w manualu PHP?

https://www.php.net/manual/en/functions.user-defined.php

Parser znajduje wszystkie funkcje które nie są uwarunkowane i one działają. Uwarunkowane muszą poczekać przed wywołaniem.

MESSIAH :)
Cytat(Tomplus @ 14.11.2019, 22:10:33 ) *
Dlaczego uważasz, że to błąd parsera skoro jest to element który jest wytłumaczony nawet w manualu PHP?

https://www.php.net/manual/en/functions.user-defined.php

Parser znajduje wszystkie funkcje które nie są uwarunkowane i one działają. Uwarunkowane muszą poczekać przed wywołaniem.

Skoro parser skanuje linia po linii caly plik i pozniej wraca na poczatek pliku to chyba jest to strata czasu lub blad parsera.
To tak jak malowac sciane pas po pasie a pozniej robic to od nowa.
Nawet nie chce wiedziec ile mozna razy wracac z konca pliku na poczatek w php bo pewnie ograniczy to moja wyobraznie.
SmokAnalog
W JavaScripcie też to masz. To się nazywa hoisting. W przypadku javascriptowych zmiennych w starym stylu (var) jest to faktycznie trochę niezręczne, ale już w przypadku funkcji niekoniecznie. Potraktuj kod jako zbiór deklaracji i instrukcji, gdzie deklaracje po prostu są, nieważne gdzie. Na tej samej zasadzie, co w klasie, gdzie kolejność metod też przecież nie ma znaczenia. Nie musi to być niewydajne, interpreter zapewne optymalizuje drugi przebieg.
Tomplus
Jak malujesz ścianę, to najpierw robisz podkład, a dopiero potem nakładasz farbę.
nospor
Cytat
Skoro parser skanuje linia po linii caly plik i pozniej wraca na poczatek pliku to chyba jest to strata czasu lub blad parsera.
Chyba troche za bardzo upraszczasz proces i mylisz pojecia parser/kompilator/wykonywanie.
Parser nie lata po milion razy po tym samym pliku. Parser leci raz i raz parsuje tylko po czym twoj kod jest zamieniany na kod maszynowy a tam to juz wyglada zupelnie inaczej
MESSIAH :)
Cytat(Tomplus @ 15.11.2019, 09:38:49 ) *
Jak malujesz ścianę, to najpierw robisz podkład, a dopiero potem nakładasz farbę.

Ale nie maluje scian po 100 razy tak jak mozna to robic w PHP

Cytat(nospor @ 15.11.2019, 10:27:24 ) *
Chyba troche za bardzo upraszczasz proces i mylisz pojecia parser/kompilator/wykonywanie.
Parser nie lata po milion razy po tym samym pliku. Parser leci raz i raz parsuje tylko po czym twoj kod jest zamieniany na kod maszynowy a tam to juz wyglada zupelnie inaczej

Czyli jak dziala PHP? Najpierw skanuje caly plik do pamieci i gdy na koncu znajdzie wywolanie funkcji wtedy z pamieci RAM wraca do linii z funkcja? Jesli by tak bylo to musialo by to znaczyc iz PHP zapisuje funkcje w pamieci uzywajac dodatkowo oznaczenia dla danej linii gdzie odszukac funkcje.
Tomplus
W innych językach istnieje kompilator którzy przetwarza kod do pliku który można wywołać. PHP też musi sprawdzić najpierw czy wszystko działa.


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.