21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
« 1 2 »
Autor Zpráva
Miloš
Profil
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
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
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
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
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
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
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
"Nebyl si to ty Měsíčku?"

Ne, eval() jsem v PHP nikdy nepoužil .. nepleteš si to s exec()? :-)
BetaCam
Profil
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
Tak na ten strojový překlad se nejspíš budu muset vyspat; teď už přestávám rozumět naprosto všemu ;-)
Timy
Profil
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
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
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
OT: Slovo deb*lní je fakt tak hrozné?
Miloš
Profil
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
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
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
habendorf
Jak bys to řešil?
Mezi námi -- určitě ne přes eval() :-)).
habendorf
Profil
Timy

Jasně, je to školní příklad, ne reálný.
Miloš
Profil
habendorf
…ale přenáší se řetězec.
Slááááááva, konečně první odpověď, kterou jsem pochopil.
Díky na tvou hlavu!„
Lidozrout
Profil *
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
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
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
Nejlépe uděláš, když se eval() vyhneš obloukem.
Yur4Y
Profil
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
Yur4Y:
Třeba Nette Framework má dobrý vlastní šablonovací systém a eval není ve frameworku použito nikde.
Aesir
Profil
[#26] Majkl578:
Opravdu není?
AM_
Profil
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
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
[#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.
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0