Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Smarty + php5
FiDO
post 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 smile.gif
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 smile.gif
Gotowy podmieniony juz plik jest tu
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 15:52