PHP使用包括内部函数

时间:2012-04-12 09:49:10

标签: php

我试图创建一个我可以调用的函数,如下所示,

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>

5 个答案:

答案 0 :(得分:8)

该用例是explicitly documented

  

如果include发生在调用文件中的函数内,那么   调用文件中包含的所有代码都将表现得像它一样   已在该功能内定义。所以,它将遵循变量   该职能的范围。此规则的一个例外是魔术常量   在包含发生之前由解析器评估。

恕我直言,在常量中保持基本路径更简单(你似乎已经在某种程度上做了)或甚至进行全站点搜索和替换(在任何体面的编辑器中这是一个30秒的任务)而不是重写所有包含的文件都使用全局变量。

答案 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,每次都包含在案例中。