繁体   English   中英

PHP使用包括内部函数

[英]PHP Use Include Inside Function

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

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')我能够看到包含文件中还有其他“未显示”错误,这似乎导致文件无法显示起来......

该用例明确记录在案

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

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

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

改变你调用函数的方式,看起来像这样:

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}";
}
?>

我想你应该读一下变量范围

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

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

因此,如果在函数中包含文件,则只能在该函数的上下文中使用其内容。

虽然您实际上没有说明您遇到的确切问题,但我怀疑您所包含的文件中没有变量。 部分解决此问题的一种有点可怕的方法是在include语句之前添加此行:

extract($GLOBALS);

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

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

$x = 1;

some_func();

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

缺点是你要使用的方法(将其包装在函数中)不起作用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM