2016-05-23 81 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(1)

我遇到的问题是,showAdvert函数将运行的所有广告,无论o r它不会出现在页面上,然后添加到“视图”,即使广告可能不会显示。

我想要的只是定义函数而不执行它,所以当它出现在页面内容中时,才会执行该函数。

+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

我在最后一行得到了一个意外的“)”,当我把它拿出来时,我得到了 “可捕捉的致命错误:Closure类的对象无法转换为字符串”。 这是在这条线上 '$ pageContent = preg_replace(“/ \ {{100}?)\}/e”,“$$ 1”,$ pageContent);' –

+0

当你调用这个函数的时候出现这个错误?听起来你忘了把'()'放在包含函数的变量之后,所以你试图回调函数本身而不是调用它。 – Barmar

+0

我认为它应该是'“$$ 1()”'所以它调用该函数。顺便说一句,你不应该在'preg_replace'中使用'e'修饰符,你应该使用'preg_replace_callback'。 – Barmar