10

我试图制作一个可以如下调用的函数,

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

5 回答 5

11

该用例已明确记录

如果包含出现在调用文件中的函数内部,则被调用文件中包含的所有代码的行为就好像它已在该函数中定义一样。因此,它将遵循该函数的变量范围。此规则的一个例外是在包含发生之前由解析器评估的魔术常量。

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

于 2012-04-12T09:59:55.497 回答
9

这是解决问题的一种方法:

更改调用函数的方式,使其如下所示:

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}";
}
?>
于 2013-11-30T04:31:48.740 回答
2

我认为您应该阅读有关变量范围的信息。

http://php.net/manual/en/language.variables.scope.php

变量的范围是定义它的上下文。

因此,如果您在函数中包含文件,则其内容仅在该函数的上下文中可用。

于 2012-04-12T09:56:42.673 回答
2

虽然您实际上并没有说明您遇到的确切问题是什么,但我怀疑这是您包含的文件不可用的变量。include部分解决这个问题的一个稍微可怕的方法是在你的语句之前添加这一行:

extract($GLOBALS);

这会将全局范围内的所有变量导入到您的函数中。但是,这不会使该功能完全符合您的要求。考虑这段代码:

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

$x = 1;

some_func();

在包含的文件中, 的值$x将是1,而不是2您想要/期望的值。这是因为$GLOBALS只包含来自全局范围的数据,它不包含来自some_func(). 在 PHP 中没有访问“父”作用域中的变量的机制。

总而言之,您要使用的方法(将其包装在函数中)将不起作用。

于 2012-04-12T09:58:44.470 回答
1
function view( $view, $file )
{
    switch ( $view )
    {
        case 'archive'  : $view = 'archive/temp';   break;
        case 'single'   : $view = 'single';     break;
    }

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

这对我有用。您也可以在案例中使用包含,或者甚至更好地构建整个 url 以每次都包含在案例中。

于 2012-04-12T10:01:26.200 回答