我试图创建一个我可以调用的函数,如下所示,
view( 'archive', 'post.php' );
这个功能真的是这个。
include( 'view/archive/post.php' );
原因是如果将来我将目录扩展为view/archive/another_level/post.php
我不想在我的代码中回到任何地方并更改所有包含路径。
目前这是我的功能,除了看来include正在函数内部调用,而不是在调用函数时被调用...
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')
我能够看到包含文件中还有其他“未显示”错误,这似乎导致文件无法显示... < / p>
答案 0 :(得分:8)
恕我直言,在常量中保持基本路径更简单(你似乎已经在某种程度上做了)或甚至进行全站点搜索和替换(在任何体面的编辑器中这是一个30秒的任务)而不是重写所有包含的文件都使用全局变量。如果include发生在调用文件中的函数内,那么 调用文件中包含的所有代码都将表现得像它一样 已在该功能内定义。所以,它将遵循变量 该职能的范围。此规则的一个例外是魔术常量 在包含发生之前由解析器评估。
答案 1 :(得分: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}";
}
?>
答案 2 :(得分:1)
我认为您应该阅读变量范围。
http://php.net/manual/en/language.variables.scope.php
变量的范围是定义它的上下文。
因此,如果在函数中包含文件,则只能在该函数的上下文中使用其内容。
答案 3 :(得分:1)
虽然您实际上没有说明您遇到的确切问题,但我怀疑您所包含的文件无法使用变量。部分解决此问题的一种有点可怕的方法是在include
语句之前添加此行:
extract($GLOBALS);
这会将全局范围内的所有变量导入到您的函数中。 然而这不会使该功能完全符合您的要求。请考虑以下代码:
function some_func () {
$x = 2;
view('archive', 'post.php');
}
$x = 1;
some_func();
在包含的文件中,$x
的值将为1
,而不是您期望/期望的2
。这是因为$GLOBALS
只包含来自全局范围的数据,它不包含some_func()
范围内的变量。在PHP中,没有用于访问“父”范围中的变量的机制。
缺点是,您想要使用的方法(将其包装在函数中)将无效。
答案 4 :(得分:0)
function view( $view, $file )
{
switch ( $view )
{
case 'archive' : $view = 'archive/temp'; break;
case 'single' : $view = 'single'; break;
}
include( TEMPLATEPATH . "/view/".$view."/".$file );
}
这对我有用。你也可以在案例中使用include,甚至可以更好地构建整个url,每次都包含在案例中。