2010-06-04 29 views
0

我有以下困境。我有一個複雜的CMS,這個CMS是由平面設計師主題。模板是純HTML,有幾個嵌套包含。我想通過查看頁面的HTML來讓設計人員更容易找到要修改的文件。PHP宏/內聯函數(避免變量超出範圍)

我首先想到的是建立這樣一些愚蠢的事:

function customInclude($what) { 
    print("<!-- Including $what -->"); 
    include($what); 
    print("<!-- End of $what -->"); 
} 

但是,你猜怎麼着?變量明顯超出了包含文件的範圍:-)我無法將它們聲明爲全局變量或參數,因爲我不知道它們是如何調用的以及有多少變量。

是否有執行某種PHP中的「宏擴展」的可能性?另一種方法來調用它:我想以面向方面的風格修改修改函數的每個調用。

我曾想過的eval(),它是唯一的出路?它會對性能產生重大影響嗎?

回答

-6

你絕對應該使用對象,名稱空間和MVC模型。否則有沒有純粹和乾淨的解決方案到你的問題。請不要使用eval,這是邪惡的。

+1

這不是一個答案,而且它根本沒有幫助。下次使用評論。無論如何,你只是重複別人的話,而不用任何支持。順便說一下,這是一個相當複雜的MVC實現,但這個問題的性質完全不同。在一位平面設計師的眼中,架構只是不相關的:她只想快速訪問磁盤上的特定文件,而不考慮apache重定向,路由,控制器,視圖,參數,ajax調用等等。只是查看URL,輸出太複雜了。 – Palantir 2010-06-04 12:27:11

+0

你是認真的嗎?當沒有解決方案時,它仍然是一個答案。但是,我並不是在談論其他人 - 沒有面向對象的人會遇到問題。這是你的呼聲,但是不要試圖用eval來繞過明顯的語言行爲。而且,我幾乎看不到其他人在這裏回答。 MVC體系結構完全按照您的需要進行設置 - 它將每個模板和代碼分開,因此設計人員無需查看代碼,反之亦然。 – 2010-06-04 13:14:47

+0

請仔細閱讀。我已經告訴過你我正在使用OOP和MVC。我有一系列的視圖(比如:node/edit.tpl.php,node/index.tpl.php等),然後是一些局部視圖,這些視圖依次調用其他局部視圖。我想幫助設計人員快速找到視圖文件。你真的覺得這很荒唐嗎?其他的「乾淨」選項是在每個視圖的頂部放置其名稱,並關閉它的底部... – Palantir 2010-06-04 13:28:06

1

不知道如果我完全理解這個問題,但如果你只是想通過展示他們的包含文件的文件名底層,使生活更容易爲設計者,那麼你可能只用這個模板文件中:

echo '<!-- Start of '.__FILE__.' -->'; 
....content... 
echo '<!-- End of '.__FILE__.' -->'; 

__FILE__只是其中的幾個Magic Constants

另外還有​​函數返回所有包含文件的數組,這可能是有用的(例如,您可以輸出所有包含文件的列表,其名稱中包含'tpl')。

+0

第一個實際上是我現在正在做的:)不幸的是,它迫使我把標題和每個模板中都有一個頁腳,這有點尷尬。 Get_included_files看起來很有趣,我可以在源代碼的末尾輸出。它仍然不是最佳的,因爲沒有顯示嵌套。 – Palantir 2010-06-04 14:37:35

1

我知道這是一個老問題,但我偶然發現了它,它讓我想起了我的東西用來做這一點。

,如果您在使用創建一個非常奇怪的變量的作用呢?

<?php 
function customInclude($___what___) { 
    echo '<!-- Including '.$___what___.' -->'; 
    include($what); 
    echo '<!-- End of '.$___what___.' -->'; 
} 
?> 

我通常建議增加一個可能的變量來只顯示這些標籤在必要的時候,你不希望別人知道......

<?php 
function __printIncludeInfo($info, $dump = false){ 
    //print only if the URL contains the parameter ?pii 
    //You can modify it to print only if coming from a certain IP 
    if(isset($_GET['pii'])){ 
     if($dump){ 
      var_dump($info); 
     } else { 
      echo $info; 
     } 
    } 
} 
function customInclude($___what___) { 
    __printIncludeInfo('<!-- Including '.$___what___.' -->'); 
    include($what); 
    __printIncludeInfo('<!-- End of '.$___what___.' -->'); 
} 
?> 

這樣你可以使用該函數打印的任何其他信息,你需要

1

這是我100%harcoded解決方案,包括定製問題。這是關於使用全局變量指向下一個包含文件名,然後包括我的自定義代理包含文件(這將取代您的自定義代理包括功能)

1 - 將此代碼添加到全局包含(無論您的customInclude功能定義)

$GLOBALS['next_include'] = ""; 
    $GLOBALS['next_include_is_once'] = false; 
    function next_include($include_file) { 
     $GLOBALS['next_include_is_once'] = false; 
     $GLOBALS['next_include'] = $include_file; 
    } 

    function next_include_once($include_file) { 
     $GLOBALS['next_include_is_once'] = true; 
     $GLOBALS['next_include'] = $include_file; 
    } 

2-創建一些包含代理包含文件,例如「debug_include」。PHP的」

<?php 
    if(empty($GLOBALS['next_include'])) die("Includes Problem"); 

    // Pre-include code 
    // .... 

    if($GLOBALS['next_include_is_once']) { 
     include_once($GLOBALS['next_include']); 
    } else { 
     include($GLOBALS['next_include']); 
    } 

    // Post-include code 
    // .... 

    $GLOBALS['next_include'] = ""; 

3 - 執行搜索,並在所有文件替換:(除debug_include.php)
搜索: '包括:((*));'作爲reg.exp
替換爲: '{next_include($ 1);包括(' debug_include.php ');}'

搜索:「include_once;作爲reg.exp
((*)。) 替換爲: '{next_include_once($ 1);包括(' debug_include.php ');}'

也許你應該需要另一個搜索和替換,如果你有一些不規範的包括像

include (....  include (....  include (.... 


我認爲你可以找到一些更好的搜索和替換模式,但我不是一個正則表達式用戶,所以我做了這是困難的方式。