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. 1. エラーの発生条件
- 2. 2. エラーが発生するコード例
- 3. 3. 解決策1: 関数の戻り値を変数に格納する
- 4. 4. 解決策2: `isset()` の代わりに `strlen()` を使う
- 5. 5. 解決策3: 配列の要素を `isset()` でチェックする
- 6. 6. 解決策4: `null` チェックを追加する
- 7. 7. 解決策5: PHPのバージョンを確認する
- 8. 8. 解決策6: `filter_input()` を使用する
- 9. 9. 解決策7: カスタム関数を使用する
- 10. 10. 解決策8: `mb_strlen()` を使う
- 11. 11. 解決策9: `empty()` を使わずに比較する
- 12. 12. 解決策10: `preg_match()` を使う
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 "ユーザー名を入力してください。";
}
?>-
前の記事
PHPのエラー『Notice: Header Information Cannot Be Modified After』の解決方法 2025.03.29
-
次の記事
java 配列の値を取得する 2025.03.31
コメントを書く