2016-05-23 23 views
1

私は現在、カスタムCMS用の広告モジュールを開発しており、テンプレートタグを使用して、WSYWIGページコンテンツエディタを使用してページに広告を追加できるようにしています。PHPは実行せずに関数を定義します

例:広告

を選択して表示するために、データベースになりますフロントエンドで{=advert_1}

、これは正規表現を介して発見されると、関数に変換すること、Template_tags.php

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

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

これは{=advert_1}は私が午前問題はshowAdvert機能に関係なく、かどうかOのすべての広告のために実行されるということですshowAdvert(1)

に変換されることを意味しますそれはページに表示されず、広告が表示されない場合でも「ビュー」に追加されません。

私が望むのは、それを実行せずに関数を定義するだけなので、ページの内容に現れたら関数が実行されます。

+1

でそれを使用するには、私はあなたが何を意味するか見当がつかない。 '{= advert_1}'がページ上にあれば 'showAdvert(1)'に変換されて実行されます。そうでない場合、変換されず実行されません。何が問題なの? – AbraCadaver

+0

変数変数を使用するときはいつでも、配列を実際に使用する必要があります。 – Barmar

+0

データベースから 'grpID'を取得しているので、これをループしてすべての"グループ "のための関数を作成し、' $ {$ advert。 $ advertGroupID} = showAdvert($ advertGroupID); ' –

答えて

1

関数式を使用してクロージャを作成します。

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

関数を呼び出すには、あなたはそれの後に括弧を配置する必要があります:

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

preg_replace_callback

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

最後の行で予期せぬ ")"が発生し、それを取り除いたときには "Catchable fatal error:クラスClosureのオブジェクトを文字列に変換できませんでした" これはこの行にあります '$ pageContent = preg_replace("/\ {=([^ \ {] {1,100}?)\}/e "、" $$ 1 "、$ pageContent); ' –

+0

あなたは関数を呼び出したときにそのエラーを取得する?関数を含む変数の後ろに '()'を置くのを忘れたように聞こえるので、関数を呼び出すのではなく関数自体をエコーし​​ようとしていました。 – Barmar

+0

私は '' $$ 1() ''でなければならないと思いますので、関数を呼び出します。ところで、 'preg_replace'に' e'修飾子を使うべきではないので、 'preg_replace_callback'を使うべきです。 – Barmar

関連する問題