コード例

PHP用語集

カテゴリー: 制御構造  閲覧数:841 配信日:2010-05-22 10:16


例外ハンドラを4回セット
・5回目に1復旧(4回目へ戻す)
・6回目にさらに1復旧(3回目へ戻す)
・この状態で投げる
    function f1(Exception $e){//普通に関数を設定しているだけだが、「set_exception_handler」の引数に指定され、呼ばれることで、この関数は、「例外ハンドラ用のユーザ定義関数」となる
echo "*** function f1() ***\n\n";
// echo $e->getMessage(), "\n\n";//getMessage()」メソッド - 「プロパティ$message」の値 = 「例外オブジェクト」生成時に渡されたメッセージ(文字列)
}

#「例外ハンドラ」用のメソッドを持つクラスを定義
class C1{
private $air = "AIRPORT";
public function m1(Exception $e){
echo "*** C1::m1() method ***\n\n";
// echo $e->getMessage(), "\n\n";
}
public function m2(Exception $e){
echo "*** C1::m2() method ***\n\n";//C1クラスm2メソッド
// echo $e->getMessage(), "\n\n";
}
}

$arr[] = set_exception_handler("f1");//①例外ハンドラ セット1回目。ここでの引数は「例外ハンドラ」用ユーザ定義関数名。引数指定することで、f1関数は「例外ハンドラ」として機能するようになる。ちなみに、例外ハンドラの返り値は、セット以前の全ての例外ハンドラ名(引数に指定した内容を配列で返す)。未設定の場合は空文字列を返し、エラー時には「FALSE」を返す。

echo "▼①内容\n";
var_dump(set_exception_handler("f1"));
echo "<hr>";

echo "▼①返り値\n";
var_dump($arr);//初めて例外ハンドラをセットしたため、以前の例外ハンドラ名はない(=set_exception_handlerの返り値はNULL)
echo "<hr>";


#②例外ハンドラ セット2回目。「例外ハンドラ」にクラス名とそれが持つメソッド名を指定
$arr[] = set_exception_handler(
array("C1", "m1")
);

echo "▼②内容\n";
var_dump(set_exception_handler(
array("C1", "m1")
));
echo "<hr>";

echo "▼②返り値\n";
var_dump($arr);//返り値は、[0]=> NULL と、1回目の例外ハンドラ引数(=f1)
echo "<hr>";


#③例外ハンドラ セット3回目。「例外ハンドラ」にオブジェクトとそれが持つメソッド名を指定
$arr[] = set_exception_handler(
array(new C1, "m2")
);

echo "▼③内容\n";
var_dump(set_exception_handler(
array(new C1, "m2")
));
echo "<hr>";

echo "▼③返り値\n";
var_dump($arr);//返り値は、[0]=> NULL と、1回目の例外ハンドラ引数(f1) と、2回目の例外ハンドラ引数([0]=>"C1" [0]=>"m1")
echo "<hr>";


#④例外ハンドラ セット4回目。「例外ハンドラ」$arr[1]=「"f1"」を指定
$arr[] = set_exception_handler($arr[1]);

echo "▼④内容\n";
var_dump(set_exception_handler($arr[1]));
echo "<hr>";

echo "▼④返り値\n";
var_dump($arr);//返り値は、[0]=> NULL と、1回目の例外ハンドラ引数(f1) と、2回目の例外ハンドラ引数([0]=>"C1" [0]=>"m1")と、3回目の……。
echo "<hr>";

restore_exception_handler();#「例外ハンドラ」をひとつ前(4回目)へ設定(set_exception_handler($arr[1]))に復旧

print_r($arr);
echo "<hr>";


echo "★5★<br>";
var_dump(restore_exception_handler());#「例外ハンドラ」をさらにもひとつ前の設定(3回目)へ復旧
print_r($arr);
echo "<hr>";

restore_exception_handler();

echo "\n--- Exception Test q---\n\n";

//catch設定していなくても、「例外ハンドラ」が有効だと、どこからでも「例外」を投げられる
//3回目のarray(new C1, "m2")が投げられる
throw new Exception("Throwing out of catch block.");

echo "--- Exception Test w ---";

・結果
▼①内容
string(2) "f1"
▼①返り値
array(1) {
[0]=>
NULL
}
▼②内容
array(2) {
[0]=>
string(2) "C1"
[1]=>
string(2) "m1"
}
▼②返り値
array(2) {
[0]=>
NULL
[1]=>
string(2) "f1"
}
▼③内容
array(2) {
[0]=>
object(C1)#1 (1) {
["air":"C1":private]=>
string(7) "AIRPORT"
}
[1]=>
string(2) "m2"
}
▼③返り値
array(3) {
[0]=>
NULL
[1]=>
string(2) "f1"
[2]=>
array(2) {
[0]=>
string(2) "C1"
[1]=>
string(2) "m1"
}
}
▼④内容
string(2) "f1"
▼④返り値
array(4) {
[0]=>
NULL
[1]=>
string(2) "f1"
[2]=>
array(2) {
[0]=>
string(2) "C1"
[1]=>
string(2) "m1"
}
[3]=>
array(2) {
[0]=>
object(C1)#2 (1) {
["air":"C1":private]=>
string(7) "AIRPORT"
}
[1]=>
string(2) "m2"
}
}
Array
(
[0] =>
[1] => f1
[2] => Array
(
[0] => C1
[1] => m1
)

[3] => Array
(
[0] => C1 Object
(
[air:C1:private] => AIRPORT
)

[1] => m2
)

)
★5★
bool(true)
Array
(
[0] =>
[1] => f1
[2] => Array
(
[0] => C1
[1] => m1
)

[3] => Array
(
[0] => C1 Object
(
[air:C1:private] => AIRPORT
)

[1] => m2
)

)

--- Exception Test q---

*** C1::m2() method ***



週間人気ページランキング / 7-31 → 8-6
順位 ページタイトル抜粋 アクセス数
1 ブラウザを閉じたらセッションデータはどうなるの? | セッション 5
2 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 4
2 PHPで定数を定義する方法は2種類ある / 配列定数の定義 4
2 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 4
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
3 T_CONSTANT_ENCAPSED_STRING | エラーメッセージ 3
3 「POSIX正規表現」と「PCRE正規表現」の違い 3
3 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 3
3 curl で Cookie を使用する 3
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 3
3 You currently have Essential access which includes access to Twitter API v2 endpoints only. | Twitter API(エラーメッセージ) 3
3 PHP用語 3
4 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 2
4 Fatal error: Using $this when not in object context in /○○.php on line △△ | Fatal error(エラーメッセージ) 2
4 ob紛らわしい関数()一覧 | 出力バッファリング制御(関数) 2
4 php-devel とは? 2
4 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 2
4 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
4 session_start() | セッション 2
4 コード例 … 「例外処理」はネストすることができる 2
2025/8/7 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2025-8-6
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6696
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2505
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2449
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1666
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1059
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 986
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 883
9 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 844
10 コード例 … 「例外処理」はネストすることができる 838
11 curl で Cookie を使用する 834
12 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 832
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 730
14 定数 720
15 インターフェイス | クラスとオブジェクト 694
16 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 683
17 メンバー | クラスとオブジェクト 645
18 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 630
19 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 600
20 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 579
2025/8/7 1:01 更新