在PHP中是否可以忽略子脚本从父脚本退出?

在PHP中是否可以忽略子脚本从父脚本退出?,php,Php,子脚本终止父脚本,因为它有退出 因为它是第三方扩展,所以我需要避免任何核心攻击。是否可能以某种方式忽略子脚本从父脚本退出。我从外部脚本调用它的控制器和方法 parent.php <?php require "child.php"; ?> <?php does something; exit; ?> <?php require "temp.php"; for($i=1;$i<10;$i++){ file_get_contents("http:/

子脚本终止父脚本,因为它有退出

因为它是第三方扩展,所以我需要避免任何核心攻击。是否可能以某种方式忽略子脚本从父脚本退出。我从外部脚本调用它的控制器和方法

parent.php

<?php

require "child.php";

?>
<?php
does something;
exit;
?>
<?php
require "temp.php";

for($i=1;$i<10;$i++){
    file_get_contents("http://url/temp.php?var=$i");
}

?>
<?php
$var = $_GET['var'];
// execute 
require "child.php";
$testController = new TestController();
$testController->method($var);
?>

child.php

<?php

require "child.php";

?>
<?php
does something;
exit;
?>
<?php
require "temp.php";

for($i=1;$i<10;$i++){
    file_get_contents("http://url/temp.php?var=$i");
}

?>
<?php
$var = $_GET['var'];
// execute 
require "child.php";
$testController = new TestController();
$testController->method($var);
?>

更新


只要我们不修改子脚本,任何替代解决方案都是可以的。

如果您确实最终编辑了核心文件,则可以在“子脚本”中使用
return

如果从全局范围调用,则执行当前脚本 文件结束。如果包含或需要当前脚本文件, 然后控制权被传递回调用文件。此外,如果 包含当前脚本文件,则返回的值将 将作为include调用的值返回。如果从调用return 在主脚本文件中,然后脚本执行结束。如果 当前脚本文件由
auto\u prepend\u文件命名
auto\u append\u file
php.ini中的配置选项,然后是该脚本 文件的执行已结束

但是,如果子脚本具有
exit
语句,则无法阻止父脚本阻止子脚本终止进程。不幸的是,您无法覆盖此功能

是否可以忽略PHP中包含的脚本中的
exit

没有

终止脚本的执行,无论从何处调用脚本

如中所述,除了使用
退出

是之外,还有其他选择。 在child.php中,可以使用return将控件返回到parent.php。 否则,如果未包含child.php,它将继续正常操作,即退出

<?php
does something;
return;
exit;
?>


如果要检查文件是否包含或是否直接运行,可以。
因此,在这种情况下,检查子文件,如果它没有包含,转到exit命令,否则继续执行其余代码。

您可能可以在线程中运行child.php。使用join等待该线程完成,然后再继续主线程。这样,在child.php中调用exit将终止子线程,主线程将继续

class myThread extends Thread {
  public function run(){
    include "child.php";
    //Call methods from child.php here
  }
}

$thread = new myThread();
$thread->start();
$thread->join();

非常感谢大家回答这个问题。最后,我提出了以下替代方案。我不确定它是否与任何设计模式相似。下面的示例不会从循环终止,尽管child.php已退出

parent.php

<?php

require "child.php";

?>
<?php
does something;
exit;
?>
<?php
require "temp.php";

for($i=1;$i<10;$i++){
    file_get_contents("http://url/temp.php?var=$i");
}

?>
<?php
$var = $_GET['var'];
// execute 
require "child.php";
$testController = new TestController();
$testController->method($var);
?>

temp.php

<?php

require "child.php";

?>
<?php
does something;
exit;
?>
<?php
require "temp.php";

for($i=1;$i<10;$i++){
    file_get_contents("http://url/temp.php?var=$i");
}

?>
<?php
$var = $_GET['var'];
// execute 
require "child.php";
$testController = new TestController();
$testController->method($var);
?>


使用exit的第三方脚本设计糟糕。这不是子脚本,而是同一个脚本。
include
require
本质上都是“将此文件的内容放在此处”的缩写。只需从child.php中删除
退出
,执行就会正常进行。他们为ajax接口和json输出开发了脚本。你仍然认为在json输出的最后使用exit是一个糟糕的设计吗?不幸的是,我意识到我的答案不符合OP的问题范围和要求,不过,我的答案留待决定,因为它可以通过对范围的一些修改来解决问题,并且可能对将来的其他人有用。我需要避免任何核心问题hack@putvande在我的帖子底部添加了另一个答案的链接,这可能对你有用。这可能是另一种选择。但就目前的问题而言,答案仍然是否定的。我认为我的答案正确地解决了问题,请告诉我问题出在哪里。+1这是OP定义的范围和他们提出的问题的确切正确答案@预设一个线程可以工作,但是在该场景中,
exit
仍然没有被忽略,它只是被显式地处理。@sjagr它在某种意义上被忽略,因为子线程退出后允许主线程在子线程终止后继续运行。对不起,我的问题不清楚。通过说“忽略退出”,我的意思是,任何替代解决方案对我来说都是一个答案,可以从父脚本完成,而无需编辑子脚本。我也应该尝试一下。