2012-04-12 138 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