[PHP] Globale functies aanroepen binnen class?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een simpele template engine waarbij er codes als {TITLE} worden omgezet naar hun echte inhoud. De link tussen de code en de inhoud wordt geregistreerd in een associatieve array. De inhoud wordt genoteerd in de vorm van een functie, dit gebeurt als volgt:

PHP:
4
$keywordArray   = array("TITLE" => "showTitle(" . $pageID . ");");


Bij het parsen van de template, worden de keywords d.m.v. een reguliere expressie vervangen door de daaraan gekoppelde functie:

PHP:
4
5
6
7
if(preg_match("/^(.*)" . $keyword . "(.*)$/", $codeArray[$i])) {
    $tempOutput = eval($function); // $function is de variabele met als waarde de functie-aanroep.
    $codeArray[$i]  = preg_replace("/^(.*)" . $keyword . "(.*)$/", "\\1" . $tempOutput . "\\2", $codeArray[$i]);
}


Maar nu het probleem. De functie ShowTitle() staat in een include en wordt geladen in de pagina waar ook een instance van de template-class wordt aangemaakt. De bovenstaande code is afkomstig uit die class. Het probleem is dat de functie showTitle() dit netjes ge-include wordt niet binnen de scope van de class valt, met als gevolg dat ik geen output krijg uit die functie (maar vreemdgenoeg ook geen foutmelding).

Wat is hiervoor de oplossing?

[ Voor 8% gewijzigd door Verwijderd op 11-07-2003 16:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik nooit eval, dit is vies en lelijk.
Om een template engine te maken is het veel leuker om references te gebruiken (staan wel aantal voorbeelden in de manual).
Globale functies zijn altijd te gebruiken binnen een class, misschien omdat je in die class de functie eval gebruikt werkt dit niet en heb je zojuist een bug ondekt :). Maar again, probeer eval te omzeilen, daarmee sluipen heel makkelijk foutjes in je scripts. Succes.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks :)

Maareh... alternatief voor eval() ?

En die references, waar vind ik die in de manual?

[ Voor 38% gewijzigd door Verwijderd op 11-07-2003 16:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Geen alternatief..
Als de indexname "TITLE" is en je zet $pageID in de indexwaarde is dat toch genoeg?
Dan volgt er in je 2e stukje code nog een :
PHP:
1
2
3
4
5
switch ($keyword) {
    case "TITLE":
        $tempOutput = showTitle($pageID);
        break;
}

En zo verder uiteraard..

Acties:
  • 0 Henk 'm!

Verwijderd

Via de table of contents van de manual (http://www.php.net/manual):
http://www.php.net/manual/en/language.references.php
Zelf zoeken kan geen kwaad hoor ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, ok :) Ik vind die switches altijd wat omslachtig. Hou het liever dynamisch, maar als dit werkt, prima :)

En references? Ik begrijp nogsteeds niet wat je daarmee bedoelt (al 2 minuten niet, hehe).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik vind het switch statement juist heel handig omdat je de verschillende stukken code mooi gescheiden houd en geef toe, het ziet er in ieder geval beter uit dan eindeloze stukken if, elseif, elseif, elseif etc. Ik neem trouwens aan dat TITLE niet je enige type data in je template parser is.

edit:
References kunnen nuttig zijn bij zo'n project. Het hangt er vanaf wat voor opzet je kiest. Recursief (met repeterende blokken in het template) of gewoon helemaal plat. Beetje experimenteren hiermee kan geen kwaad voordat je dit zou gaan implementeren in zo'n project.

References zijn te vergelijken met pointers in C. Variabelen met het geheugenadres van een andere variabele en zo verwijzen naar een andere variabale. Staan duidelijke voorbeelden in de manual (zie een paar berichten eerder).

[ Voor 47% gewijzigd door Verwijderd op 11-07-2003 17:05 ]


Acties:
  • 0 Henk 'm!

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 16-09 10:29

Apache

amateur software devver

Verwijderd schreef op 11 July 2003 @ 16:51:
Gebruik nooit eval, dit is vies en lelijk.
Om een template engine te maken is het veel leuker om references te gebruiken (staan wel aantal voorbeelden in de manual).
Globale functies zijn altijd te gebruiken binnen een class, misschien omdat je in die class de functie eval gebruikt werkt dit niet en heb je zojuist een bug ondekt :). Maar again, probeer eval te omzeilen, daarmee sluipen heel makkelijk foutjes in je scripts. Succes.
idd, er zijn maar weinig voorbeelden waar eval terecht gebruikt word.

Maar ik heb bvb ook een template engine ... blijkt tegenwoordig een populaire hobby te zijn ... die alles omzet naar php waarna het door eval word gehaald.

If it ain't broken it doesn't have enough features


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
True story.

Maareh... references? :)

Acties:
  • 0 Henk 'm!

Verwijderd

Apache schreef op 11 juli 2003 @ 17:04:
Maar ik heb bvb ook een template engine ... blijkt tegenwoordig een populaire hobby te zijn ... die alles omzet naar php waarna het door eval word gehaald.
Dus als je bepaalde stukken in je code/layout wil wijzigen ben je dagen kwijt. 'k Zou naar andere manieren op zoek gaan om een layout te genereren. Genereer met je PHP script bijvoorbeeld XML en transformeer dat via XSL naar HTML (of wat je ook wilt).

[ Voor 2% gewijzigd door Verwijderd op 11-07-2003 17:09 . Reden: typo ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
R E F E R E N C E S ? 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Ongeduldigheid wordt hier niet bijzonder gewaardeerd... Zeker niet als je niet goed leest. Zie edit van eerdere post van mij.

[ Voor 4% gewijzigd door Verwijderd op 11-07-2003 17:14 . Reden: typo ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
/me bows his head in shame.

Sorry. Heb je edits over het hoofd gezien. Maareh, je moet wel toegeven dat references een breed begrip, dus ik vraag me af of ik zonder toelichting had begrepen wat je nou bedoelde ;)

Dank!

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien een breed begrip, maar in een nog eerdere post had ik al een linkje gepropt naar de php manual, in het bijzonder het deel over references.
Maargoed, misschien een idee om maar weer ontopic te gaan :).

Acties:
  • 0 Henk 'm!

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 16-09 10:29

Apache

amateur software devver

Verwijderd schreef op 11 juli 2003 @ 17:08:
[...]

Dus als je bepaalde stukken in je code/layout wil wijzigen ben je dagen kwijt. 'k Zou naar andere manieren op zoek gaan om een layout te genereren. Genereer met je PHP script bijvoorbeeld XML en transformeer dat via XSL naar HTML (of wat je ook wilt).
nee hoor, eerst worden de template geevalueerd en op een stack gegooid, deze stack word dan omgezet naar php.

Helemaal geen aanpassingen nodig in die php code, en dit alles gebeurt on the fly (caching optioneel) dus als er een layout aanpassing is die meteen zichtbaar.

If it ain't broken it doesn't have enough features


Acties:
  • 0 Henk 'm!

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Apache schreef op 11 juli 2003 @ 17:04:
[...]


idd, er zijn maar weinig voorbeelden waar eval terecht gebruikt word.

Maar ik heb bvb ook een template engine ... blijkt tegenwoordig een populaire hobby te zijn ... die alles omzet naar php waarna het door eval word gehaald.
Ik heb voor mijn template engine een compiler geschreven die van een template PHP code maakt. Die code wordt gewoon ge-include, stuk sneller dan eval (parsing overhead). Zeker i.c.m. b.v. PHP-Accelerator.

Motor-forum.nl


Acties:
  • 0 Henk 'm!

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 16-09 10:29

Apache

amateur software devver

Bananeman2002 schreef op 12 juli 2003 @ 13:18:
[...]

Ik heb voor mijn template engine een compiler geschreven die van een template PHP code maakt. Die code wordt gewoon ge-include, stuk sneller dan eval (parsing overhead). Zeker i.c.m. b.v. PHP-Accelerator.
Dit is volgens mij alleen sneller als je de php output al gecached hebt op disk.

Anders zit je met de overhead van het schrijven/lezen van een file met bijhorende interrupts terwijl alles nu in php5 standaard by-ref gebeurt dus geen copy-on-writes.

K'ga hiermee wel eens een test uitvoeren, maar de tijd die eval gebruikt is verwaarloosbaar.

If it ain't broken it doesn't have enough features


Acties:
  • 0 Henk 'm!

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Apache schreef op 12 July 2003 @ 13:29:
[...]


Dit is volgens mij alleen sneller als je de php output al gecached hebt op disk.

Anders zit je met de overhead van het schrijven/lezen van een file met bijhorende interrupts terwijl alles nu in php5 standaard by-ref gebeurt dus geen copy-on-writes.
Je wint er voornamelijk wat mee als je loopende templates hebt, dus b.v. een topiclist met daarin een stukje per topic dat 20x ofzo wordt uitgespuugd. Je template hoeft maar één keer geladen te worden, dus je hebt maar één keer die overhead.
K'ga hiermee wel eens een test uitvoeren, maar de tijd die eval gebruikt is verwaarloosbaar.
Binnen de opzet die ik gebruik scheelde het veel. Ik moet zeggen dat ik niet meer precies weet hoeveel (is al een tijd geleden), maar het was beduidend sneller. Gebruikers van de site merkten het verschil in response-tijd.

Motor-forum.nl

Pagina: 1