如何判断是否从包含的文件中调用了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()的返回值。
不太好,但它在我的网络应用程序/框架中提供了我需要的功能。
答案 0 :(得分:2)
好问题。看一下manual中的例子,我想你不能。
想到的最佳解决方法是让项目中的所有包含不返回裸值,而是返回包含返回值(return array(1);
)的数组。
其他所有想到的东西(至少我的)都涉及定义一些常量或变量来标记你是否在包含中。没什么优雅的。
答案 1 :(得分:1)
此行为是设计使用 - 当包含成功(或包含文件的值为include
)时,return
语句返回1,因为即使{{{},脚本执行仍可继续1}}失败,程序员可能会检查这种情况。
从手册:
[返回值]是1,因为 包括成功。请注意 上述例子之间的区别。 第一个使用return() 包含文件,而另一个 不。如果文件不能包括在内, 返回FALSE并且E_WARNING是 发出的。
在这种情况下,只需在代码中不使用1作为文件的返回值,即,此返回值实际上保留供PHP include
语句使用。
答案 2 :(得分:1)
你可能可以使用debug_backtrace(),但它并不是一个理想的解决方案。它很慢,你必须做很多工作才能得到你想要的结果。
很遗憾,您描述的情况超出了include
和return
的常规使用范围。我只是改变你的逻辑来使用它。为什么不通常在最后调用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。