PHP では、trycatch ブロック内で定義された変数をブロック外で使用できるのはなぜですか?

WBOY
リリース: 2016-06-20 12:58:10
オリジナル
1455 人が閲覧しました

function f() {    try {        $a = new obj;    } catch (Exception $e) {        echo $e->getMessage();    }    $a->func();}
ログイン後にコピー

上記のように、$a 変数は引き続き func() を呼び出すことができます。つまり、$a は $ 内で生成されたオブジェクトであるということです。 a $a オブジェクトのメモリは、関数が呼び出されたときに再利用されません。
PHP マスターの皆さん、この現象の理由を教えていただければ幸いです。


ディスカッション (解決策) への返信

try ブロックでは、内部のコンテンツを定義するだけで、存在する場合は指定された操作を実行する必要があります。例外です。それ自体は関数ではありません。
例外がスローされた場合、try ステートメントのスクリプトは実行を停止し、すぐに catch ステートメントのスクリプトの実行に切り替わります。

したがって、例外処理に関係なく、上記のコードは

function f() {    $a = new obj;    $a->func();}
ログイン後にコピー
ログイン後にコピー

と同等です。 try catch 構造体は、例外を処理するための単なるプログラム ブロックです
形式的に言えば、これは、try ブロック内の if else、while、for、および foreach 構造体

と同じです。内部のコンテンツを定義するだけで、存在する場合は指定された操作を実行する必要があります。例外。それ自体は関数ではありません。
例外がスローされた場合、try ステートメント内のスクリプトは実行を停止し、すぐに catch ステートメント内のスクリプトの実行に切り替わります。

つまり、例外処理を除けば、上記のコードは

function f() {    $a = new obj;    $a->func();}
ログイン後にコピー
ログイン後にコピー


と同等なので、ここではローカル変数とその他の問題を区別する必要はないでしょうか?

try catch 構造体は、例外を処理するための単なるプログラム ブロックです
形式的に言えば、if else、while、for、foreach 構造体と違いはありません

たとえば、 if ステートメント ブロックで定義された変数は次のとおりです。 ローカル変数は外部からアクセスできません。

if(1) {  $a = 123;}echo $a;
ログイン後にコピー


暗記せずに自分の目で確認してください

try catch 構造は単なる例外処理です プログラム ブロック
は、形式的には if else、while、for、foreach 構造と何ら変わりません


PHP および MySQL Web 開発 P110 ページを読みました - 5.7 スコープのセクション。プログラミング言語が異なれば変数のスコープ規則も異なるとします。
PHP ルール:
関数内で宣言された変数のスコープは、変数が宣言されたステートメントから関数の終わりまでです。これを関数スコープと呼びます。これらの変数はローカル変数になります。
モデレーターさんが仰っていましたが、PHPのローカル変数のスコープルールが分かりませんでしたが、モデレーターさん、ありがとうございました。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート