PHP使用包括内部函数

cno*_*gr8 8 php

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

view( 'archive', 'post.php' );
Run Code Online (Sandbox Code Playgroud)

而这个功能真正起作用的是什么.

include( 'view/archive/post.php' );
Run Code Online (Sandbox Code Playgroud)

这样做的原因是,如果将来我将目录扩展为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}" );
    }
Run Code Online (Sandbox Code Playgroud)

如何才能使此功能正确包含该文件?

编辑:

没有显示错误.感谢@Ramesh的错误检查代码,ini_set('display_errors','On')我能够看到包含文件中还有其他"未显示"错误,这似乎导致文件无法显示...

Álv*_*lez 9

该用例明确记录在案:

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

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


cod*_*onk 6

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

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

include( view('archive','post') );
Run Code Online (Sandbox Code Playgroud)

你的功能看起来像这样:

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

    return TEMPLATEPATH . "/view/{$view}/{$file}";
}
?>
Run Code Online (Sandbox Code Playgroud)