Smarty + php5 |
Smarty + php5 |
6.08.2003, 23:28:27
Post
#1
|
|
Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) |
Jak pewnie zainteresowani wiedza, Smarty standardowo nie dziala z php5. Wyszedl patch, ktory to niby poprawial. Otoz okazuje sie, ze nie dziala on do konca. Zamienial on wywolania fukncji w stylu:
[php:1:7ace6ef18a] $func = "nazwa_funkcji"; $func(parametry); [/php:1:7ace6ef18a] na [php:1:7ace6ef18a] $func = "nazwa_funkcji"; call_user_func($func, parametry); [/php:1:7ace6ef18a] Dzisiaj korzystalem akurat ze smarty'ego i za cholere nie dzialalo mi assignowanie zmiennych w template'cie. Nawet glupi przyklad: Kod {assign var="test" value="test"}
{$test} nie dziala... Sprawdzcie zreszta sami. Mowa oczywiscie o wersji zpatchowanej do php5, ale nie dziala zarowno na php4 jak i php5 (przynajmniej u mnie, sprawdzalem na php4.3.2 [win], 4.3.3RC2[lin] php5 snap z 1 sierpnia [win/lin]). Jako, ze jak cos mi wdepnjie na ambicje to nie popuszczam to wzielem sie za rozwiazywanie problemu... Oczywiscie najpierw poszukalem w necie, ale nic nie znalazlem. Chodzi o to, ze assign jest wywolywany przez call_user_func, ale jeden z parametrow funkcji assign jest obiekt smarty'ego przekazany przez referencje. Ale funkcja call_user_func przyjmuje parametry przez wartosc, wiec nasza zmienna jest assignowana do tego skopiowanego obiektu smarty, ktory jest niszczony po wyjsciu z funkcji (z call_user_func()). Malo tego jak wyszperalem w sieci nie jest to bug, ktos to dodal do listy bugow na php.net, ale w odpowiedzi otrzymal, ze to nie jest bug, ze ma dokladnie przeczytac manuala Pierwsze co mi przyszlo do glowy to uzyc "call-time pass-by-reference" czyli, przekazania zmiennej przez referencje podczas jej wywolywania (glupio brzmi...), w skrocie chodzi o cos takiego: [php:1:7ace6ef18a] function func($v) { // ... } [...] func(&$arg); [/php:1:7ace6ef18a] Czyli, ze nie trzeba zmieniac definicji funkcji, zeby przekazac przez referencje. Trudno byloby zmienic definicje call_user_func.... Jednak ten pomysl nie jest najlepszy, bo przekazywanie w ten sposob ma status deprecated, czyli moze zostac niedlugo usuniete na stale. Pozatym wyskakuje warning na 50 tysiecy linijek... Mozna sie go pozbyc wlaczajac ten spoob przekazywania w php.ini, ale jak pisalem to jest deprecated, wiec nie wiadomo jak dlugo by dzialalo takie rozwiazanie, pozatym nie kazdy moze modyfikowac php.ini na serwerze z ktorego korzysta, a 'w locie' (ini_set) sie tego nie da zmienic. Z pomoca przychodzi wiec funkcja call_user_func_array, ktora dziala w zasadzie tak samo z ta roznica, ze parametry do wywolywaniej funkcji przekazujemy nie bezposrednio, tylko przez tablice. [php:1:7ace6ef18a] function test($v,$v2) { //... } call_user_func_array('test', array($arg1, $arg2)); [/php:1:7ace6ef18a] Nie ma nigdzie (chyba) mowy o tym, ze nie mozna do tablic zapisywac referencji, wiec mozna to zrobic. Co prawda ta tablica jest kopiowana do call_user_func_array, ale skopiowana referencja nadal bedzie referencja do tej samej zmiennej. W ten oto sposob udalo mi sie rozwiazac ten problem... Mam nadzieje, ze sie komus to przyda Gotowy podmieniony juz plik jest tu |
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 15:52 |