【问题标题】:after early return does next code execute提前返回后是否执行下一个代码
【发布时间】:2016-10-01 22:12:24
【问题描述】:

我有 php 文件,我在其中使用 if statments 并且我通过 ajax 调用此文件.. onSuccess 如果文件上传成功或错误,它会给我结果。

代码如下:

if(empty($_FILES['file']['name'])){
    return "no image was selected";
}
if($two_many_images){
    return "Only x images are alowed to upload";
}
if($size>2014522){
    return "Size error";
}
foreach($_FILES["file"]['tmp_name'] as $key=>$imgLocation){ 
    uploadImage($_FILES["fileToUpload"]['tmp_name'][$key], $imgLocation);
}

问题:首先如果语句条件为真,我的第二个如果语句是否执行?

【问题讨论】:

  • 不,return 退出该范围内的执行,(函数/方法)
  • 因为返回类型后一切都消失了
  • 所以你的意思是我的第二个条件不会执行?
  • 没错,如果命中返回,则返回到它调用的地方。把它想象成一个指针,如果你调用一个函数,你将指针发送到该函数,当它返回时,指针返回到调用函数的行并从那里继续运行。

标签: php return


【解决方案1】:

这很容易演示,例如你有一个函数:

funciton foo(){
    echo "foo\n";
    return;
    echo 'bar';
}

如果你打电话

foo();

会打印出来

foo

但不是bar。一旦执行指针命中返回,它将返回到调用foo() 的位置。这也可以很容易地显示出来。

foo();
foo();
foo();

打印

foo
foo
foo

更新:根据您的 cmets,做您想做的事情的正确方法是这样的

if(empty($_FILES['file']['name'])){
    echo "no image was selected";
    exit();
}
if($two_many_images){
    echo "Only x images are alowed to upload";
    exit();
}
if($size>2014522){
    echo "Size error";
    exit();
}
foreach($_FILES["file"]['tmp_name'] as $key=>$imgLocation){ 
    uploadImage($_FILES["fileToUpload"]['tmp_name'][$key], $imgLocation);
}

我使用 exit() 而不是 return,因为它更具可读性并且更有意义,即使在您的情况下 return 具有相同的效果。 Exit 将完全结束 php 的执行,这正是您想要的。你也可以做类似的事情

die( 'Message' );

或者

exit( 'Message' );

也将退出并输出消息。它们几乎都一样......我把echo放在第一位只是因为我总是觉得把东西放在出口有点脏。不知道为什么会这样,也许我将它与意外行为联系起来,因为在不打算在框架之外运行的文件顶部看到 die() 这么多。但我离题了。

只是为了完整起见,根据您的 cmets,如果您从 PHP 的全局范围调用 return,它没有返回的地方,因此执行会在该点停止。最好使用 exit 或 die 的原因是 return 具有明显不同的行为,即从函数调用中“返回”数据。因此,使用行为与您想要的最匹配的方法更具可读性。即结束当前脚本(PHP 实例)的执行。

【讨论】:

  • 在我测试的函数中,它像你说的那样工作,但我问的是整个文件
  • 它只是执行结束,这种情况你不会得到返回的响应,你需要先echo它出来然后return;
  • 哇投反对票?真的吗?我是认真的。您至少可以提出拒绝投票的原因,这是否不能回答问题。事实上,我不仅如此,还提供了最佳实践建议。
  • @Aryan - 我知道你没有,其他人有。至于投票,没问题,很高兴我能帮助你。
【解决方案2】:

不,您的第二条语句将不会被执行。当调用 return 时,其余代码将不会被执行。 PHP 文档说:

如果从全局范围调用,则结束当前脚本文件的执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多