PHPのエラー『Fatal Error: Can’t Use Function Return Value in Write Context』の解決方法

  • 作成日 2025.03.31
  • php
PHPのエラー『Fatal Error: Can’t Use Function Return Value in Write Context』の解決方法

PHPで関数の戻り値を直接 `empty()` や `isset()` などの一部の関数に使用すると、「Fatal Error: Can’t Use Function Return Value in Write Context」という致命的なエラーが発生することがある。このエラーの発生条件と解決方法について詳しく見ていく。

1. エラーの発生条件

このエラーは、主に次のような状況で発生する。

  • 関数の戻り値を直接 `empty()` に渡している
  • 関数の戻り値を `isset()` に渡している (PHP 5 以前)
  • 配列の要素を `empty()` で直接評価しようとしている
  • 使用しているPHPのバージョンが古い (PHP 5.x 系)

2. エラーが発生するコード例

次のコードは、このエラーを引き起こす典型的な例。

<?php
if (empty(trim($_POST['username']))) {
    echo "ユーザー名を入力してください。";
}
?>

このコードを実行すると、次のようなエラーが発生する。

Fatal error: Can't use function return value in write context in /path/to/script.php on line X

3. 解決策1: 関数の戻り値を変数に格納する

関数の戻り値を直接 `empty()` に渡すのではなく、一度変数に格納してから `empty()` を使用する。

<?php
$username = trim($_POST['username']);
if (empty($username)) {
    echo "ユーザー名を入力してください。";
}
?>

4. 解決策2: `isset()` の代わりに `strlen()` を使う

`empty()` の代わりに `strlen()` を使用することで、関数の戻り値を評価できる。

<?php
if (strlen(trim($_POST['username'])) === 0) {
    echo "ユーザー名を入力してください。";
}
?>

5. 解決策3: 配列の要素を `isset()` でチェックする

配列の要素が存在するかどうかをチェックする場合は、まず `isset()` で確認してから `empty()` を使用する。

<?php
if (isset($_POST['username']) && empty(trim($_POST['username']))) {
    echo "ユーザー名を入力してください。";
}
?>

6. 解決策4: `null` チェックを追加する

変数が `null` の場合を考慮する場合は、`??` (Null合体演算子) を使用する。

<?php
$username = trim($_POST['username'] ?? '');
if (empty($username)) {
    echo "ユーザー名を入力してください。";
}
?>

7. 解決策5: PHPのバージョンを確認する

PHP 5 以前では `isset()` に関数の戻り値を渡すことができなかったが、PHP 7 以降では可能になっている。使用しているPHPのバージョンを確認し、可能であれば最新バージョンにアップデートする。

<?php
echo 'PHP Version: ' . phpversion();
?>

8. 解決策6: `filter_input()` を使用する

$_POST や $_GET の値を直接処理するのではなく、`filter_input()` を使って取得する方法もある。

<?php
$username = trim(filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING));
if (empty($username)) {
    echo "ユーザー名を入力してください。";
}
?>

9. 解決策7: カスタム関数を使用する

頻繁に使用する場合は、カスタム関数を作成して処理を統一するのも有効。

<?php
function isEmptyString($str) {
    return strlen(trim($str)) === 0;
}

if (isEmptyString($_POST['username'] ?? '')) {
    echo "ユーザー名を入力してください。";
}
?>

10. 解決策8: `mb_strlen()` を使う

マルチバイト文字を考慮する場合は、`mb_strlen()` を使用すると安全。

<?php
if (mb_strlen(trim($_POST['username'] ?? '')) === 0) {
    echo "ユーザー名を入力してください。";
}
?>

11. 解決策9: `empty()` を使わずに比較する

`empty()` の代わりに `=== ”` を使用することで、エラーを回避できる。

<?php
if (trim($_POST['username'] ?? '') === '') {
    echo "ユーザー名を入力してください。";
}
?>

12. 解決策10: `preg_match()` を使う

正規表現を使って文字列が空かどうかを判定することも可能。

<?php
if (preg_match('/^\s*$/', $_POST['username'] ?? '')) {
    echo "ユーザー名を入力してください。";
}
?>