PHP - 如何检查是否从include()'d文件中调用了return()?

时间:2010-03-29 17:50:05

标签: php include

如何判断是否从包含的文件中调用了return()。问题是include()返回'int 1',即使没有调用return()。这是一个例子......

included_file_1.php

<?php

return 1;

included_file_2.php

<?php

echo 'no return here, meep';

main.php

<?php

$ret = include('included_file_1.php');

// This file DID return a value, int 1, but include() returns this value even if return() wasn't called in the included file.
if ($ret === 1)
{
    echo 'file did not return anything';
}

var_dump($ret);

$ret = include('included_file_2.php');

// The included file DID NOT return a value, but include() returns 'int 1'
if ($ret === 1)
{
    echo 'file did not return anything';
}

var_dump($ret);

编辑:作为临时解决方案,我正在捕捉include()(来自echo / print语句)的输出。如果产生了任何输出,我会忽略include()的返回值。

不太好,但它在我的网络应用程序/框架中提供了我需要的功能。

6 个答案:

答案 0 :(得分:2)

好问题。看一下manual中的例子,我想你不能。

想到的最佳解决方法是让项目中的所有包含不返回裸值,而是返回包含返回值(return array(1);)的数组。

其他所有想到的东西(至少我的)都涉及定义一些常量或变量来标记你是否在包含中。没什么优雅的。

答案 1 :(得分:1)

此行为是设计使用 - 当包含成功(或包含文件的值为include)时,return语句返回1,因为即使{{{},脚本执行仍可继续1}}失败,程序员可能会检查这种情况。

从手册:

  

[返回值]是1,因为   包括成功。请注意   上述例子之间的区别。   第一个使用return()   包含文件,而另一个   不。如果文件不能包括在内,   返回FALSE并且E_WARNING是   发出的。

在这种情况下,只需在代码中不使用1作为文件的返回值,即,此返回值实际上保留供PHP include语句使用。

答案 2 :(得分:1)

你可能可以使用debug_backtrace(),但它并不是一个理想的解决方案。它很慢,你必须做很多工作才能得到你想要的结果。

很遗憾,您描述的情况超出了includereturn的常规使用范围。我只是改变你的逻辑来使用它。为什么不通常在最后调用return的文件只需拨打return 2?这样你就会得到一个在正常比较中仍然评估为真的值,但是你可以将它用作其他return 1调用之间的区别。

答案 3 :(得分:0)

如果在包含的文件中没有返回任何内容,那么include函数默认返回1。否则它将返回包含文件发送的任何内容。 Echo和print语句不是返回,它必须是PHP指定的'return'语句。其他一切都将正常处理。这段代码基本上是说'文件执行得当吗?'并且它返回1,'是的确如此。'

PHP: include - Manual - 在安全警告消息下方查看“处理退货”,然后查看示例5及其下方的文本。它完美地解释了这一切。

答案 4 :(得分:0)

$ ret = include('...');如果文件存在,将始终返回1.

尝试创建变量并检查它是否已设置。

<强> include_file_1.php

<?php
$includeFile1 = true;

<强> main.php

<?php
include('included_file_1.php');

if (isset($includeFile1) == true) 
{
    echo "It was included";
}

答案 5 :(得分:0)

永远不需要,也永远不知道你可以,但我可能会在每个包含的脚本的末尾使用它:

return __FILE__; 

或:

return basename(__FILE__);

或者如果您不需要这种特异性,请按照之前的建议使用2。