【问题标题】:Return statement in file doesn't stops class definition?文件中的返回语句不会停止类定义?
【发布时间】:2012-10-02 23:34:54
【问题描述】:

正如此处php.net/return 所述,可以选择停止执行包含'return' 语句。

谁能告诉我为什么这样做如下所述

//test1.php

include 'test2.php';
var_dump(class_exists('TestClass_ShouldntBeDefined'));

//test2.php

return;
class TestClass_ShouldntBeDefined { }

// 运行

$ php -f test1.php
bool(true)

为什么会这样?

当 test2.php 更改为任何其他形式的代码时执行 (if(true) { ... })

return;
{
    class TestClass_ShouldntBeDefined { }
}

然后它按预期工作

$ php -f test1.php
bool(false)


PHP 版本

$ php -v
PHP 5.4.7 (cli) (built: Sep 13 2012 04:20:14) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

【问题讨论】:

    标签: php include return


    【解决方案1】:

    Return 结束执行,但不停止包含。

    在第一种情况下,包含文件,返回后停止执行并将控制权交还给test1.php。但该类已包含在内,因此 class_exists 返回true。所以案例 1 按预期工作。

    在第二种情况下,通过使用花括号,类定义成为执行的一部分。在定义类之前,返回结束包含的执行。

    【讨论】:

    • +1 为 serial down 投票者 ! (当然还有正确答案)
    • 你写“但不是创造”是什么意思?如果没有 return 声明,它会被“创建”吗?我认为类可能已定义或未定义,对象创建是不同的事情。您的回答很好,并解释了我的怀疑。非常感谢!
    • @Adam 我的意思是实例化。但你是对的,那部分不清楚。我删除了它。
    • @JvdBerg 您是否参考了有关此行为的 PHP 手册?
    • @JvdBerg - 谢谢。该页面只是说在全局范围内使用 return 时脚本执行结束;它没有具体说明仍在解析的类声明。是你知道的手册中的任何地方吗?我一直在寻找更具体的东西,但没有找到任何东西。
    【解决方案2】:

    类和函数不是脚本顺序执行的一部分。 return 语句只结束顺序执行而不是 oop 执行。

    【讨论】:

    • 感谢您如此快速的响应和简短的解释!
    猜你喜欢
    • 2022-01-24
    • 2015-04-24
    • 1970-01-01
    • 2012-09-24
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多