Toon posts:

[PHP] Strings converteren naar oo code

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben tegen twee dingen aangelopen, die waarschijnlijk wel onder dezelfde noemer vallen, en kom er niet uit. Hoop dat iemand me wat meer inzicht kan geven.

1) Stel, je hebt een string, gevuld met oo code: bijv. 3 lagen aan properties.

$str = "property->subproperty->subsubproperty";

En je wilt die code, maar dan omgezet in daadwerkelijke oo code, toekennen aan een object. Ik probeerde iets als:

$obj->{$str} = "waarde";

of

$obj->{eval("\$str")} = "waarde";

En nog tientallen variaties daarop.
Hoe pak ik zoiets aan?


2) Vergelijkbaar probleem bij het benaderen van een klasse.
Ik wil graag een methode aansporen van een geinclude, maar niet geïnstantieerde, klasse, maar de klassenaam is variabel.

Als je de klassenaam vantevoren weet, dan gebruik je iets als:

$resultaat = Klassenaam::methode();

Maar als de klassenaam nu in een variabele zit, hoe los je het dan op?
Iets als?

$klassenaam = "Klassenaam";
$resultaat = eval("\$klassenaam")::methode();


Het komt dus allemaal een beetje neer op hoe je PHP code, verpakt in een string, tot leven brengt in daadwerkelijke syntax.

Hoop dat je kan helpen.

  • Grum
  • Registratie: Juni 2001
  • Niet online
PHP:
1
2
eval( '$obj->' . $str . ' = "waarde";' );
eval( '$resultaat = ' . $klassenaam . '::methode();' );


Maar als je deze constructies nodig hebt is der al iets goed fout in je code-opzet :).

Verwijderd

Topicstarter
Top, dank je wel.
Ja, is duidelijk dat het niet netjes is. In de betreffende applicatie is het een strijd om efficiëntie en schoonheid geworden, de eerste heeft gewonnen.

Trouwens, als ik jouw code uitvoer met dubbele quotes ("), dan krijg ik een parse error voor de eval code. Terwijl als ik de code in single quotes zet, OF $resultaat backslash (reference?) als in \$resultaat, dan werkt eval wel.

Kun je me iets korts vertellen over het onderscheid, en met welke quotes het verstandig is om algemene PHP code mee uit te voeren? '\n' is in PHP bijv. ook weer iets anders dan "\n" heb ik gemerkt.

Alvast bedankt.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Simpel:

Single quotes: wordt NIET geparsed.
* Special chars werken niet (lees \n \t \r etc).
* Variabelen werken niet (lees $bla wordt LETTERLIJK $bla).
* Sneller omdat het niet wordt geparsed (in php4.1+ redelijk te verwaarlozen).
* Gebruik van de ' kan niet zonder escapen ( \' ipv ')
* Gebruik van de \ kan niet voor een ' zonder te escapen (anders is het de constructie hierboven - dus dat wordt \\'

Double quotes: wordt WEL geparsed.
* \n zal werken.
* Variabelen zullen werken.
* Gebruik van een letterlijke $ (alsof je een variabele naam in de text zet) kan niet zonder escapen (\$blaat ipv $blaat zet een letterlijke $ neer)
* Gebruik van een " kan niet zonder escapen ( \" ipv " )
* Gebruik van een \ voor een char zodat je onbedoeld een special char maakt kan niet zonder esacpen ( \\n ipv \n - als je een newline wilt)
* Gebruik van een \ voor een " kan niet zonder escapen ( \\" ipv \" )

Hummmz dat wasset wel zo'n beetje :D