理解が足りていない箇所が多いのですが、何卒よろしくお願いいたします。
PHPのエラー発生時の例外処理にての不明点がいくつかございます。
*例外処理について以外の内容も含みます。メソッドやメソッド外の定義並びに、
例外処理に関して誤解しているところが多いかと思います。
【不明点】
・echoの優先順序について
・メソッド内でreturnされた後の流れ
・throw処理について
・function test_exception()メソッド外の優先順位
【誤解しているであろう点】
・上から順に実行されることを強く認識しすぎている
・引数となる変数への誤解
・インスタンス化のタイミング。その後の流れ
・他
html
1<?php 2 3function test_exception($date) { 4 echo "2\n"; 5 try { 6 echo "3\n"; 7 8 return new DateTime($date); 9 echo "4\n"; 10 11 } catch (Exception $e) { 12 echo "5\n"; 13 throw $e; 14 } 15 echo "6\n"; 16} 17 18echo "1\n"; 19 20try { 21 22 $datetime = test_exception("1991-01-01"); 23 24 echo $dateTime->format('Y-m-d')."\n"; 25 echo "7\n"; 26} catch (Exception $e) { 27 echo "8\n"; 28} 29?> 30
まず、上記のコードが実行される流れとして,$datetimeの右辺が問題のない整数の場合は以下
html
11 22 33 47
$datetime = test_exception("199x-01-01")のように右辺に問題のある整数の場合("199x-01-01")
は以下
html
11 22 33 45 58
と実行されるようです。
Q1.
1点目の疑問ですが、上から順に実行される場合はなぜ「echo 2」ではなく、「echo 1」
が先に来るのでしょうか。「echo1」はメソッドfunction test_exception($date)の外のようですが、
メソッド外のechoが優先されるのには理由があるのでしょうか。
Q2.
「echo 2」,「echo 3」が優先されるのはわかりますが、2点目としてreturn new DateTime($date);がどのような状況になっているのか不明です。
returnで何らかの数値やメソッドを返す場合、このケースでは
return new DateTime($date);→function test_exception($date)に返っているのでしょうか??
その場合の流れの理解に困っています。
$datetimeの右辺の整数に問題があるかないかにしろ、echo4実行はなさそうです。
・問題ない整数の場合はreturn処理されるため、try-catchが終了され、次に移る。
・問題のある整数だった場合は、return箇所でエラーとなるため、catchに移りecho5の処理が行われる。
よって、echo4が出力されないのはわかります。
ただreturn new DateTime($date);自体がどのような状態なのか理解できておりません。
・newでインスタンス化する。
・DateTimeというクラスに$date引数が入っている。
・$date引数には下で定義した1991-01-01もしくは199x-01-01が入っている?
function test_exception()は冒頭で定義したメソッドなので、$datetimeの右辺がリンクしているのはわかりますが、引数に任意の数字を入れても、それは最終的に$datetimeに代入されるため、冒頭のfunction test_exception()で使いたくても$datetimeとして使用する??
この辺りが理解できておりません。
わかりにくいですが
$datetime → function test_exception()
*形式が違うからfunction test_exception()の引数内になぜ1991-01-01もしくは199x-01-01を反映できるのか??
根本的な理解が足りていないと思うのですが、どうしても理解できません。
Q3.
echo 6についてですが、こちらもfunctionメソッド内でtry-catchの外の領域かと思われますが、echo2は問題なく出力されているのに、echo6が出力されない理由も不明です。
Q4.
catch内の echo "5\n";の後、throw $e;で投げられた$e変数の行方が不明です。
まず、paizaなどで学んだ際、通常throwはtry内で使っておりましたが、catch内でも使用は問題なのでしょうか。
また、try内でthrowが使用された場合はcatchへエラー内容を$eとして投げるかと思われますが、こちらの箇所ではecho 5の後に$e変数をどこに投げたのか不明です。
下部のecho 8の箇所へ投げられたのかと思いましたが、echo 7とecho 8の箇所でもtry-catchで例外処理がされるので、その場合は
・echo7箇所でエラー発生
↓
・catchへエラーが運ばれecho8実行されるが、その場合、Exception $eへ運ばれたエラーは
echo5で投げられた$eが優先されるのかecho 7箇所のエラーが優先されるのか不明
*echo 5でのthrow $eが上記のような動作をしていない場合は、現時点で、単にecho 7,echo8の箇所のtry-catchが実行されただけと認識しております。
質問内容や関数に関しての理解が足りていないながら、このような的外れなご質問をさせていただきました。勉強不足だと自認しておりますが、助言などいただけますと幸いです。
*そもそもメソッドと関数という言葉を同義で使用しておりましたがどうやら違いそうです。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー