Autor | Zpráva | ||
---|---|---|---|
Miloš Profil |
#1 · Zasláno: 23. 9. 2008, 19:39:17
Pořád nemůžu pochopit smysl funkce eval().
Z manuálů jsem se dočetl, že Vyhodnotí řetězec jako PHP kód, ale k čemu je to dobré? Například tohle <?php $a = "Prdlajs"; eval("echo $a;"); ?> přece normálně zapíšu takhle: <?php $a = "Prdlajs"; echo($a); ?> Takovéhle použití eval() mi připadá stejně smysluplné, jako — kdybych psal URL do vyhledávacího pole Googlu, abych od něj obdržel klikací odkaz — kdybych napsal Koze Nozdře (na její e-mail koza@nozdra.com), aby mi poslala svoji e-mailovou adresu (koza@nozdra.com), abych jí mohl na tuto adresu (koza@nozdra.com) něco poslat. — atd. atd. Příkladů na využití funkce eval() jsem na webu sice několik našel, ale ani jeden mě nepřesvědčil o smysluplnosti (resp. jsem význam takového použití nepochopil). Mohl by mi někdo, prosím, uvést nějaký opravdu jednoduchý příklad, kdy má smysl eval() použít? |
||
Měsíček Profil |
#2 · Zasláno: 23. 9. 2008, 19:44:31 · Upravil/a: Měsíček
Možná by neuškodilo pár citací s dokumentace:
"Mimo jiné to může být užitečné pro ukládání kódu do textového pole databáze pro pozdější provedení." a "Pamatujte také, že proměnné dané hodnoty podle eval () si ponechá hodnoty v hlavním skriptu na pozdější použití." |
||
Miloš Profil |
#3 · Zasláno: 23. 9. 2008, 19:48:23
Měsíček
Asi budu tupější, ale já si pod tím nic nedokážu představit. Mohl bys, prosím, nějaký jednoduchý konkrétní příklad? |
||
Měsíček Profil |
#4 · Zasláno: 23. 9. 2008, 19:53:59 · Upravil/a: Měsíček
Ještě pár odkazů (pro názory na eval() v PHP):
http://php.vrana.cz/funkce-pro-vyhodnoceni-php-kodu.php http://odvarko.cz/php-trik-tydne-include-retezce A tento odkaz ti pomůže pochopit to co jsi chtěl, jen budeš muset překládat :) http://blog.joshuaeichorn.com/archives/2005/08/01/using-eval-in-php/ Je to tam trochu více rozepsané i s konkrétními příklady. <ot> Miloši máš ICQ? </ot> |
||
Miloš Profil |
#5 · Zasláno: 23. 9. 2008, 20:02:22 · Upravil/a: Miloš
Tak na ty dva české odkazy jsem už narazil před odesláním prvního postu, ale nic jsem z nich nepochopil.
Dlouhý anglický text nezvládám, protože jsem měl na konzervatoři ruštinu a anglicky jsem se nikdy nenaučil natolik, abych zvládal takhle dlouhé texty. To opravdu neexistuje nějaké jednoduché a pro neprogramátora uchopitelné vysvětlení? <ot>ICQ jsem si nikdy nepořídil</ot> |
||
Měsíček Profil |
#6 · Zasláno: 23. 9. 2008, 20:07:52
Sám nechápu ten smysl tak dokonale abych si dovolil vysvětlovat:
http://translate.google.cz/translate?u=http%3A%2F%2Fblog.joshuaeichorn .com%2Farchives%2F2005%2F08%2F01%2Fusing-eval-in-php%2F&sl=en&tl=cs&hl =cs&ie=UTF-8 Anglicky precizně taky neumím, ale z tohoto doslovného překladu se dá pochopit 80%. Jinak to ICQ mě mrzí chtěl jsem si popovídat o improvizaci na klavír :) |
||
BetaCam Profil |
#7 · Zasláno: 23. 9. 2008, 20:08:52
Miloš
Eval je věc na kterou se v 99,99% případech může zapomenout a je to lepší. OT: Mimochodem vim, že zhruba před rokem sem se tady směkym furt hádal, že na všechno používá eval(). Nebyl si to ty Měsíčku? |
||
Měsíček Profil |
#8 · Zasláno: 23. 9. 2008, 20:10:29 · Upravil/a: Měsíček
"Nebyl si to ty Měsíčku?"
Ne, eval() jsem v PHP nikdy nepoužil .. nepleteš si to s exec()? :-) |
||
BetaCam Profil |
#9 · Zasláno: 23. 9. 2008, 20:17:03
Měsíček
„Ne, eval() jsem v PHP nikdy nepoužil .. nepleteš si to s exec()? :-)“ njn přecejenom už je to davno. :) exec() to byl :) |
||
Miloš Profil |
#10 · Zasláno: 23. 9. 2008, 20:20:29
Tak na ten strojový překlad se nejspíš budu muset vyspat; teď už přestávám rozumět naprosto všemu ;-)
|
||
Timy Profil |
#11 · Zasláno: 23. 9. 2008, 20:31:15
Obecně se něco takového používá, když člověk potřebuje spouštět funkci, kterou třeba předá argumentem. Nebo když chceš změnit dvacet proměnných obr1, obr2, obr3 apod. Takže když chceš napsat nějakou funkci, která bere jako argument jinou funkci (klasické mapování, například), můžeš využít eval(). I když v php tuším zrovna stačí napsat $$funkce();. A když chceš změnit dvacet proměnných, které se liší třeba jen číslem, můžeš taky využít eval. Ačkoliv by samozřejmě bylo lepší, kdybys místo 20 proměnných měl jedno pole :-). Na opravdu smysluplné využití eval člověk narazí jen výjimečně.
|
||
imploder Profil |
#12 · Zasláno: 23. 9. 2008, 22:02:04
Na získání hodnoty matematického výrazu v něčem takovém (kdyby se příklad a správný výsledek generovaly dynamicky) by byl eval() dobrá zkratka. Jenom by se muselo pohlídat, aby tam nemohl být škodlivý kód, ale na to by u počítání stačilo zakázat písmena.
|
||
habendorf Profil |
#13 · Zasláno: 24. 9. 2008, 20:53:53
Miloš
Představ si primitivní aplikaci, která provede fci, jejíž název uživatel zadal do inputu. Takže uživatel naťuká do inputu "phpinfo()" a server vrátí odpověď. Jinými slovy, „Vyhodnotí řetězec jako PHP kód“ jak jsi sám uvedl v prvním příspěvku. Uznávám, že příklad je to dost ******* :o) A známé pravidlo říká, že "eval is evil". |
||
habendorf Profil |
#14 · Zasláno: 24. 9. 2008, 20:54:52
OT: Slovo deb*lní je fakt tak hrozné?
|
||
Miloš Profil |
#15 · Zasláno: 24. 9. 2008, 21:08:01
habendorf
„uživatel naťuká do inputu "phpinfo()" a server vrátí odpověď“ A copak to nejde (stejně jednoduše) přes get nebo post? Přináší v takové situaci eval() nějaké zjednodušení? |
||
habendorf Profil |
#16 · Zasláno: 24. 9. 2008, 21:13:39
Miloš
Teď ti nerozumím. Form se odešle přes get nebo post, to je jedno, ale přenáší se řetězec. Nebo si vem, že třeba máš aplikaci, kde do inputu naťukáš mat. výraz a aplikace vrátí výsledek. Jak bys to řešil? |
||
Timy Profil |
#17 · Zasláno: 24. 9. 2008, 21:14:20
Miloš
Je celkem jedno odkud získáš data, důležité je, že je vyhodnotíš přes eval(): eval($_GET["kod"]); ...což je samozřejmě donebevolající prasárna. Kloudný příklad na eval se zkrátka hledá velice špatně. |
||
Timy Profil |
#18 · Zasláno: 24. 9. 2008, 21:14:50
habendorf
„Jak bys to řešil?“ Mezi námi -- určitě ne přes eval() :-)). |
||
habendorf Profil |
#19 · Zasláno: 24. 9. 2008, 21:16:14
Timy
Jasně, je to školní příklad, ne reálný. |
||
Miloš Profil |
#20 · Zasláno: 24. 9. 2008, 21:21:55
habendorf
…ale přenáší se řetězec.“ Slááááááva, konečně první odpověď, kterou jsem pochopil. Díky na tvou hlavu!„ |
||
Časová prodleva: 1 rok
|
|||
Lidozrout Profil * |
#21 · Zasláno: 14. 2. 2010, 16:47:26
Mě se eval() vyplatil v případě, že jsem si do databáze ukládal podmínku $neco>6 a dál s tím pracoval:
$schopnost=mysqli_fetch_array($obj_schopnost); eval("if(".$schopnost["potreba_schopnosti"].") echo 'vyhodnocení';"); nevím jak jinak bych z řetězce tu podmínku do toho ifu napsal |
||
Nox Profil |
#22 · Zasláno: 14. 2. 2010, 16:54:00
Lidozrout:
J, na podobný problém jsem narazil a narazím, ale rozhodně se plánuji pokusit to udělat jiným způsobem Do db si můžeš uložit parametr třeba min_level (obvzlášť při tomto designu DB to nebude problém).... pro složitější výrazy (které budou ne až tak při podmínkách jako při akcích) to možná budu řešit uvedením jména souboru s funkcí (anebo budou v jednom souboru a uvede se jen jméno, to už je detail) Takže eval opět nebude třeba |
||
AM_ Profil |
#23 · Zasláno: 14. 2. 2010, 18:54:40
Krásně je to vidět na klasických kompilovaných jazycích, kde žádný eval není a technicky ani být nemůže (leda by všichni uživatelé měli po ruce kompilátor). Takové jazyky eval() nemají a je jim bez něj dobře. V pěti procentech případů je možná použit tam, kde opravdu něco ulehčí, zbylých 95% jeho užití je důsledek lenosti programátorů, kterým se nechtělo vymýšlet lepší kód.
|
||
Majkl578 Profil |
#24 · Zasláno: 14. 2. 2010, 18:59:02
Nejlépe uděláš, když se eval() vyhneš obloukem.
|
||
Yur4Y Profil |
#25 · Zasláno: 14. 2. 2010, 19:46:32
Ja som písal kedysi dosť obšírnu template triedu a použitie eval mi značne zjednoduchšilo kód, vyhol som sa zložitým preg_split()om a podobným veciam. Používajú to aj niektoré známe systémy, takže zrejme to úplna sprostosť nebude, ale používal by som to čo najmenej. Ako píše AM_, väčšinou to je o tom, že programátor nevie/nechce použiť niečo iné.
|
||
Majkl578 Profil |
#26 · Zasláno: 14. 2. 2010, 19:57:13
Yur4Y:
Třeba Nette Framework má dobrý vlastní šablonovací systém a eval není ve frameworku použito nikde. |
||
Aesir Profil |
#27 · Zasláno: 14. 2. 2010, 20:03:50
|
||
AM_ Profil |
#28 · Zasláno: 14. 2. 2010, 20:31:09 · Upravil/a: AM_
Yur4Y:
Co se týče použití v template systémech, přijde mi jako optimální řešení to, co používá např. Nette či Smarty: šablonu ze své nativní podoby kompiluje do čistého PHP kódu, ten uloží do cache souboru který následně includuje. Náročné na naprogramování, nicméně rychlé a efektivní při spouštění. [#27] Aesir OK, řekněme, že tvrzení "nikde" od Majkl578 nebylo zcela přesné; asi to myslel tak, že eval() není stěžejní myšlenka Nette, jako je tomu u jiných systémů. |
||
Majkl578 Profil |
#29 · Zasláno: 14. 2. 2010, 20:46:05 · Upravil/a: Majkl578
Aesir:
Dobře, jediné použití této metody je na zde. A to je krajní případ - provede se když se nepovede uložit template do souboru nebo se cache nepoužívá. "Příkladem spolupráce jsou šablony, které se kompilují do PHP skriptů a ukládají do dočasného adresáře jako soubory s příponou .php. Naopak typickou překážkou je příkaz eval(), na kterém framework nestaví." Nette Framework: Cache - Zdroják. [#28] AM_: „od Alpharda“ Myslel jsi mě? :) |
||
Aesir Profil |
#30 · Zasláno: 14. 2. 2010, 20:48:07
[#28] AM, [#29] Majkl578:
Já jsem to také tak pochopil. Jen jsem chtěl upozornit, že tomu tak (bohužel) není, že by se v Nette eval nepoužívalo vůbec. A abych nebyl tak úplně mimo, tak šablonovací systém, který nepoužívá eval() a přesto složité struktury překládá do nativního PHP je například PHPTAL. |
||
Téma pokračuje na další straně.
|
0