4

ここでphp.net/returnに記載されているように、includewith'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が他の形式のコードに変更された場合、execute(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
4

2 に答える 2

9

Returnは実行を終了しますが、インクルードを停止しません。

最初のケースでは、ファイルがインクルードされ、戻りと制御がに戻った後に実行が停止しtest1.phpます。ただし、クラスが含まれているため、class_existsはを返しますtrue。したがって、ケース1は期待どおりに機能します。

2番目のケースでは、中括弧を使用することにより、クラス定義が実行の一部になります。クラスが定義される前に、リターンはインクルードの実行を終了します。

于 2012-10-12T07:35:57.423 に答える
2

クラスと関数は、スクリプトの順次実行の一部ではありません。returnステートメントは、oop実行ではなく、順次実行のみを終了します。

于 2012-10-12T07:40:14.673 に答える