[PHP]error_clear_last関数の詳細解説

PHP

こんにちは!今回は、PHPのerror_clear_last関数について詳しく解説していきます。

error_clear_last関数とは?

error_clear_last関数は、最後に発生したエラー情報をクリアする関数です。PHP 7.0.0以降で使用可能です。

基本構文

void error_clear_last ( void )

基本的な使用例

1. シンプルな使用例

<?php
// エラーを発生させる
@file_get_contents("non_existent_file.txt");

// エラー情報を取得
$error = error_get_last();
print_r($error);

// エラー情報をクリア
error_clear_last();

// クリア後のエラー情報を取得
$error = error_get_last();
var_dump($error); // NULL
?>

実践的な使用例

1. エラーハンドリングクラス

<?php
class ErrorHandler {
    private $lastError = null;

    public function executeWithErrorHandling(callable $callback) {
        // エラー情報をクリア
        error_clear_last();

        // 処理を実行
        $result = $callback();

        // エラーが発生したか確認
        $this->lastError = error_get_last();

        return [
            'result' => $result,
            'error' => $this->lastError
        ];
    }

    public function getLastError() {
        return $this->lastError;
    }
}

// 使用例
$handler = new ErrorHandler();
$result = $handler->executeWithErrorHandling(function() {
    return @file_get_contents("non_existent_file.txt");
});

if ($result['error']) {
    echo "エラーが発生しました: " . $result['error']['message'];
}
?>

2. ファイル操作での使用

<?php
function safeFileOperation($filepath, callable $operation) {
    // エラー情報をクリア
    error_clear_last();

    // エラー制御演算子を使用して操作を実行
    $result = @$operation($filepath);

    // エラーが発生したか確認
    $error = error_get_last();

    return [
        'success' => $error === null,
        'result' => $result,
        'error' => $error
    ];
}

// 使用例
$result = safeFileOperation('test.txt', function($file) {
    return file_get_contents($file);
});

if (!$result['success']) {
    echo "ファイル操作エラー: " . $result['error']['message'];
}
?>

3. データベース操作での使用

<?php
class DatabaseWrapper {
    private $connection;

    public function query($sql) {
        error_clear_last();

        $result = @mysqli_query($this->connection, $sql);
        $error = error_get_last();

        if ($error) {
            throw new Exception(
                "データベースエラー: " . $error['message']
            );
        }

        return $result;
    }
}
?>

エラーハンドリングパターン

1. 複数操作のエラー管理

<?php
function executeOperations(array $operations) {
    $results = [];

    foreach ($operations as $key => $operation) {
        error_clear_last();

        $results[$key] = [
            'result' => @$operation(),
            'error' => error_get_last()
        ];
    }

    return $results;
}

// 使用例
$operations = [
    'file_read' => function() { return file_get_contents('test.txt'); },
    'directory_list' => function() { return scandir('non_existent_dir'); }
];

$results = executeOperations($operations);
foreach ($results as $key => $result) {
    if ($result['error']) {
        echo "{$key}でエラーが発生: " . $result['error']['message'] . "\n";
    }
}
?>

2. エラーロギング機能

<?php
class ErrorLogger {
    private $logFile;

    public function __construct($logFile) {
        $this->logFile = $logFile;
    }

    public function executeAndLog(callable $operation) {
        error_clear_last();

        $result = @$operation();
        $error = error_get_last();

        if ($error) {
            $this->logError($error);
        }

        return $result;
    }

    private function logError($error) {
        $message = date('Y-m-d H:i:s') . " - Error: " . 
                  $error['message'] . " in " . 
                  $error['file'] . " on line " . 
                  $error['line'] . "\n";

        file_put_contents($this->logFile, $message, FILE_APPEND);
    }
}
?>

注意点とベストプラクティス

1. エラー制御演算子との併用

<?php
function safeOperation(callable $callback) {
    error_clear_last();
    $result = @$callback();  // @を使用してエラー出力を抑制
    return error_get_last();
}
?>

2. try-catchとの組み合わせ

<?php
function executeSafely(callable $callback) {
    try {
        error_clear_last();
        $result = @$callback();
        $error = error_get_last();

        if ($error) {
            throw new ErrorException(
                $error['message'],
                0,
                $error['type'],
                $error['file'],
                $error['line']
            );
        }

        return $result;
    } catch (Exception $e) {
        // エラー処理
        return null;
    }
}
?>

まとめ

error_clear_last関数の主なポイント:

  1. 最後のエラー情報をクリアできる
  2. エラーハンドリングの精度向上に役立つ
  3. エラー制御演算子(@)との相性が良い
  4. エラーロギングシステムに有用

活用シーン:

  • ファイル操作
  • データベース操作
  • エラーロギング
  • 複数操作の連続実行

注意点:

  • PHP 7.0.0以降でのみ使用可能
  • エラー制御演算子と組み合わせて使用
  • try-catchブロックとの適切な組み合わせ

これらの点を理解して使用することで、より堅牢なエラーハンドリングが実装できます。

以上で、error_clear_last関数の解説を終わります。
ご質問やご不明点があれば、お気軽にコメントしてください!

タイトルとURLをコピーしました