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

PHP-如何检查是否从include()调用了return();d文件?,php,include,Php,Include,如何判断是否从包含的文件中调用了return()。问题是include()返回“int 1”,即使没有调用return()。这里有一个例子 包含的\u文件\u 1.php <?php return 1; <?php echo 'no return here, meep'; <?php $ret = include('included_file_1.php'); // This file DID return a value, int 1, but include()

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

包含的\u文件\u 1.php

<?php

return 1;
<?php

echo 'no return here, meep';
<?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);
<?php
$includeFile1 = true;
<?php
include('included_file_1.php');

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

好问题。看看书中的例子,我想你不能

想到的最佳解决方法是使项目中的所有include都不返回裸值,而是返回一个包含返回值的数组(
返回数组(1);


想到的所有其他事情(至少是我的)都涉及到定义一些常量或变量来标记您是否在包含中。没有优雅的内容。

如果包含的文件中没有要返回的内容,则默认情况下包含函数返回1。否则,它将返回包含文件发送的任何内容。Echo和print语句不是return,它必须是PHP指定的“return”语句。其他一切都会正常处理。这段代码基本上是说,‘文件执行正确了吗?’,然后返回1,‘是的,它执行了。’


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

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

从手册中:

[返回值]为1,因为 包括是成功的。注意 上述示例之间的差异。 第一个在 包含文件,而另一个包含 不如果文件不能包括在内, 返回FALSE,并显示E_警告 发布

在这种情况下,不要在代码中使用1作为文件的返回值,也就是说,这个返回值实际上是为PHP
include
语句保留的

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

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

包含文件\u 1.php

<?php

return 1;
<?php

echo 'no return here, meep';
<?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);
<?php
$includeFile1 = true;
<?php
include('included_file_1.php');

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

您可能可以利用,但这并不是一个理想的解决方案。它很慢,你需要做很多工作才能得到你想要的结果


不幸的是,您描述的情况超出了
include
return
的常规用法。我只想改变你的逻辑来处理它。为什么不让通常不调用
return
的文件在最后调用
return2
?这样,您将得到一个在正常比较中仍然计算为true的值,但您可以将其用作其他
返回1
调用之间的区别。

不需要,也不知道您可以,但我可能会在每个包含的脚本末尾使用此值:

return __FILE__; 
或:


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

是的,但是如果包含脚本,include()将返回传递给包含文件中return()的值,或者“int 1”表示成功包含。因此,当include()返回“int 1”时,我无法判断它是包含文件的返回值还是include()。胡说。如果您知道该文件返回它自己的值,那么可以假定该值是您希望它返回的值。Include将永远不会覆盖您的返回值以发送已完成的1。这是关于你确切地知道你的文件做什么,以及从中得到什么值。如果您知道您的文件没有返回任何内容,那么该值应始终为1。Animuson:是的,但我不知道其他人的文件在做什么。此外,还会出现一些边缘情况,弹出窗口会破坏框架,并会成为其他人调试的pita。不过,检查输出并不能解决问题。如果他们发送输出和有效的返回值呢?那么返回值会被忽略吗?你是对的,你不知道你的用户将把什么放入他们的文件中,但是使用你的框架的程序员有责任确切地了解他们在做什么,并在他们开始搞乱之前阅读文档。如果整个框架可以从返回值中断,则需要重新考虑框架。animuson:include()d文件本质上表示模块控制器的单个操作。如果文件返回一个值,该值将被格式化为正确的响应类型(即json、xml等)。如果输出是从操作文件中生成的,则输出将被模板化以用于标准web演示。我不想依赖动作脚本生成输出,如果意外输出空白,它可能会中断,但我没有任何选择(不涉及回溯或反射)。这很糟糕,那么我将无法优雅地处理输出:(.我想我唯一的选择是检查include()是否生成任何输出(echo/print)。如果是这样,那么我将忽略返回值。
debug_backtrace
的好主意-没有想到。但是,我认为它不会起作用,因为包含的文件在include之后调用时不会在backtrace中留下任何跟踪(没有双关语)。Zombat:很好的建议,但我debug_backtrace()跳过include()但是,我可以使用eval()执行代码,并附加一个debug_backtrace()。但是这种方法太混乱,可能会导致其他更难调试的边缘情况。悲伤的一天:(。