2012-04-12 91 views
6

我試着使我可以調用如下函數,PHP使用內部包含功能

view('archive', 'post.php'); 

,什麼功能確實是這樣的。

include('view/archive/post.php'); 

這樣做的理由是,如果在未來我展開目錄是view/archive/another_level/post.php我不希望有任何地方回去在我的代碼和更改所有的包括路徑。

目前這是我擁有的功能,但它看來,包括正在函數調用裏面,而不是當調用函數被調用......

function view($view, $file) 
    { 
     switch ($view) 
     { 
      case 'archive' : $view = 'archive/temp'; break; 
      case 'single' : $view = 'single';  break; 
     } 

     include(TEMPLATEPATH . "/view/{$view}/{$file}"); 
    } 

我怎樣才能得到這個函數能夠正確包含文件?

編輯:

沒有顯示錯誤。感謝@ Ramesh提供的錯誤檢查代碼,ini_set('display_errors','On')我能夠看到包含文件中還有其他「未顯示」錯誤,這似乎導致文件不顯示出來...

+4

這沒有什麼錯 - 它應該按預期工作......你遇到了什麼問題? – scibuff 2012-04-12 09:51:26

+0

發佈錯誤消息 – 2012-04-12 09:57:06

+0

我沒有得到一個錯誤,它只是沒有什麼打印... – cnotethegr8 2012-04-12 09:58:38

回答

7

使用情況explicitly documented

如果包括出現在函數內部調用文件中,然後 都包含在所謂的文件的行爲的代碼,就好像它 已經內部的定義功能。因此,它將遵循該函數的變量 範圍。此規則的一個例外是魔術常量 ,在包含發生之前由解析器對其進行評估。

恕我直言,讓基礎路徑保持常量(您已經在某種程度上已經做到了這一點)甚至可以進行全站點搜索和替換(這是任何像樣的編輯器中的30秒任務)而不是重寫所有包含的文件以使用全局變量。

1

雖然你沒有真正說明你確切的問題是什麼,我懷疑它是變量不可用於您的包含文件。部分地解決這個問題稍微可怕的方式就是你include語句之前添加此行:

extract($GLOBALS); 

這將導入從全球範圍內的所有變量到您的功能。 但是這不會使該功能完全按照您的要求進行。考慮以下代碼:

function some_func() { 
    $x = 2; 
    view('archive', 'post.php'); 
} 

$x = 1; 

some_func(); 

包含文件的$x值將是1,不2正如您希望/期望。這是因爲$GLOBALS只包含來自全局範圍的數據,它不包含來自some_func()範圍的變量。沒有訪問PHP中「父」作用域變量的機制。

不足之處在於,您想要使用的方法(將其封裝在函數中)不起作用。

0
function view($view, $file) 
{ 
    switch ($view) 
    { 
     case 'archive' : $view = 'archive/temp'; break; 
     case 'single' : $view = 'single';  break; 
    } 

    include(TEMPLATEPATH . "/view/".$view."/".$file); 
} 

這對我有用。也可以使用包含在案例中的內容,或者甚至更好地構建整個網址,以便每次包含在案例中。

+0

它可以工作,但是如果你想從父文件使用全局作用域,它不是一個解決方案。 但@ sean9999的解決方案非常簡單實用。 – Mephiztopheles 2015-02-12 21:57:04

5

這裏是你可以解決這個問題的一種方法:

改變你打電話給函數的方式,所以它看起來是這樣的:

include(view('archive','post')); 

和你的功能應該是這樣的:

<?php 
function view($view, $file) 
{ 
    switch ($view) 
    { 
     case 'archive': $view = 'archive/temp'; break; 
     case 'single' : $view = 'single';  break; 
    } 

    return TEMPLATEPATH . "/view/{$view}/{$file}"; 
} 
?> 
+0

好主意。簡單,但沒有出現在我的腦海裏:D – Mephiztopheles 2015-02-12 22:00:26