2016-05-23 17 views
1

Ich entwickle derzeit ein Werbemodul für ein benutzerdefiniertes CMS und verwende Vorlagen-Tags, damit Kunden Anzeigen über einen WSYWIG-Seiteninhaltseditor in ihre Seiten einfügen können.PHP Define Function ohne Ausführen

Eg. {=advert_1}

auf dem Frontend, wird dies durch einen regulären Ausdruck gefunden werden und dann in eine Funktion umgewandelt werden, die in einer Datenbank eine Anzeige aussehen

Template_tags.php

while ($advertRow = $advertResult->fetch_assoc()) { 
    $advertGroupID = $advertRow['grpID']; 
    $advert = "advert_"; 

    ${$advert . $advertGroupID} = showAdvert($advertGroupID); 
} 

auswählen und anzeigen Dies bedeutet, {=advert_1} wird in showAdvert(1)

konvertiert werden Das Problem, das ich habe, ist, dass die showAdvert Funktion für alle Anzeigen unabhängig davon ausgeführt wird, ob o R nicht es erscheint auf der Seite, die dann zu den "Ansichten" hinzugefügt wird, obwohl die Anzeige möglicherweise nicht angezeigt wird.

Was ich will, ist nur die Funktion zu definieren, ohne sie auszuführen, so wenn sie im Seiteninhalt erscheint, nur dann wird die Funktion ausgeführt werden.

+1

Ich habe keine Ahnung, was du meinst. Wenn '{= advert_1}' auf der Seite ist, wird es in 'showAdvert (1)' konvertiert und ausgeführt. Wenn nicht, wird es nicht konvertiert und wird nicht ausgeführt. Was ist das Problem? – AbraCadaver

+0

Jedes Mal, wenn Sie Variablenvariablen verwenden, sollten Sie wirklich ein Array verwenden. – Barmar

+0

Da es sich um die 'grpID' aus der Datenbank handelt, durchläuft es diese und erstellt für jede" Gruppe "eine Funktion, die jeweils in der Zeile $ {$ advert ausgeführt wird. $ advertGroupID} = showAdvert ($ advertGroupID); ' –

Antwort

1

Verwenden Sie einen Funktionsausdruck, um einen Abschluss zu erstellen.

${$advert . $advertGroupID} = function() use($advertGroupID) { 
    showAdvert($advertGroupID); 
}; 

die Funktion aufzurufen, müssen Sie Klammern, nachdem es setzen:

$name = 'advert_1'; 
echo $$name(); 

es nutzen zu können, mit preg_replace_callback

preg_replace_callback("/\{=([^\{]{1,100}?)\}/", function($match) { 
    return $match[1](); 
}, $pageContent); 
+0

Ich bekam ein unerwartetes ")" in der letzten Zeile, und als ich das herausholte, bekam ich "Catalable fatal error: Objekt der Klasse Closure konnte nicht in String konvertiert werden". Dies ist in dieser Zeile '$ pageContent = preg_replace ("/\ {= ([^ \ {] {1.100}?) \}/E "," $$ 1 ", $ pageContent);' –

+0

Haben Sie Erhalten Sie diesen Fehler, wenn Sie die Funktion aufgerufen haben? Klingt so, als hätten Sie vergessen, '' '' hinter die Variable zu setzen, die die Funktion enthält. Sie haben also versucht, die Funktion selbst zu wiederholen, statt sie aufzurufen. – Barmar

+0

Ich denke es sollte '" $$ 1() "sein, also ruft es die Funktion auf. Übrigens sollten Sie den 'e' Modifikator nicht in' preg_replace' verwenden, Sie sollten 'preg_replace_callback' verwenden. – Barmar

Verwandte Themen