Archief - PHP: eval problem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Linwe

Legacy Member
Hey guys,

Klein vraagje, wellicht omdat ik er zelf om de 1 of de andere reden maar blijf overzien ofzo...?
Waarom lukt dit me niet ? (Print gewoonweg niets af)

PHP:
$cat = new Category(1);
echo "_" . eval("\$cat->getName();");

Terwijl dit wel resultaat geeft:
PHP:
$cat = new Category(1);
echo "_" . $cat->getName();

Rvl

Legacy Member
eval("$cat->getName()"); zal meer resultaten opleveren (ook al lijkt dit me in deze context maar nutteloos). Ge moogt u variabelen niet escapen met \, daar zit de fout.

Linwe

Legacy Member
Ik had net het idee die \ er bij te plaatsen om letterlijk die $cat _variabele_ (dus met "$" erbij) te gebruiken om daar dan de methode getName() van op te roepen.
De oplossing die jij hier nu geeft had ik uiteraard ook al getest, maar krijg steeds diezelfde error
"Parse error: parse error, unexpected ')' in ...: eval()'d code on line 1"

Die krijg'k niet als de \ er bij staat, maar dan print hij gewoon niets af.



In deze context is het uiteraard niets waard, maar het is om nadien in een dynamische functie te steken :)

Rvl

Legacy Member
geef eens de uiteindelijke bedoeling weer van u functie want het zo interpreteren is zeer moeilijk. Hier heeft de eval functie namelijk totaal geen nut en is zelfs fout. Als je wat meer uitleg geeft over wat je juist wil bekomen is het makkelijker te helpen
Zoiets als onderstaande code werkt wel maar is maar een basisvoorbeeld van wat je zou kunnen doen.
PHP:
<?php
class Test
{
	public function test() { return "dit is een test"; }
}

$obj = new Test();
eval("\$str = \"{$obj->test()}\";");
echo $str;
?>

edit: misschien kan je uit dit bovenstaand voorbeeld zien wat je fout deed.

Linwe

Legacy Member
Aha ! Dankzij u voorbeeld heb'k een correcte oplossing. De reden dat er niets werd afgeprint lag hem dus niet aan "\$", maar aan het feit dat mijn "echo eval(...)" niet correct is.
Die echo, of eender wel statement behoort thuis IN de eval functie, net zoals de $str =... in u voorbeeld.

Waarom deze manier van werken? Wel, voor een functie die via een paar parameters de juiste data in bv een selectbox/table giet.
Aan die functie geef ik de classname && methodname mee, waarop de return een juist geïtereerde selectbox / table teruggeeft.


Bedankt dus, stom klein foutje maw :)

Freakshow

Legacy Member
of deze code als het meteen moet getoont worden:
PHP:
<?php
class Test
{
    public function test() { return "dit is een test"; }
}

$obj = new Test();
eval('echo $obj->test();');
?>

let op de enkele quotes van eval(), zo wordt uw string niet getransformeerd.

Slicer

Legacy Member
Moest je geen echo willen maar gewoon het resultaat teruggeven dan werkt het volgende:

PHP:
$cat = new Category(1);
echo "_" . eval("return \$cat->getName();");

Simpele reden: eval geeft de waarde van een return terug (of NULL als het geen return tegenkomt). Zie de manual

Waarom deze manier van werken? Wel, voor een functie die via een paar parameters de juiste data in bv een selectbox/table giet.
Aan die functie geef ik de classname && methodname mee, waarop de return een juist geïtereerde selectbox / table teruggeeft.

Kijk ook eens naar de reflection api (php 5) of call_user_func_array (php 4) (of call_user_func). Hiermee kan je makkelijk dynamisch functies aanroepen.

Linwe

Legacy Member
thx nog voor de antwoorden, maar zoals ik dus al zei lag "mijn probleem" niet zozeer bij het "verstaan van" he. De reden dat ik niets te zien kreeg was omdat ik deed: echo eval(...) ipv eval(echo...)


(dus ja, ik weet dan ook wel hoe ik het moet afprinten, ook al is zijn voorbeeld met het setten van een variabele ;))
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan