2016-05-23 82 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