Studio Happyvalley

Nullを引数へ
渡せない問題を
CatGPTが怪傑

PHP8以降になり
Wordpressで頻繁に
エラーが発生。

image: Nullを引数へ渡せない問題をCatGPTが怪傑
Probrem Passing Null To Parameter

特にmw-wp-formで『Nullを引数へ渡せない』というエラーが出るようになった

 | 2024/07/06

当サイトでも使用しているWPのプラグインに不具合続出

PHP8アップデート後、Custom_Field_Suiteのエラーの次に多いのが、mw-wp-formプラグインです。
’Deprecated: preg_replace(): Passing null to parameter’というエラーがでます。
PHP 8.1以降では引数に`null`を渡すことが非推奨になったためです。
このエラー表示は、wp-config.phpでdefine( 'WP_DEBUG', true );にしてなければ表示はされませんが、エラーなのでこれは修正する必要があります。
特にmw-wp-formプラグインはすでに開発が終了しているため修正バージョンがでるのを待つとかもありません。
国会じゃないので問題が発覚したら先送りせず即座に修正しないといけません。

https://studio-happyvalley.com/wp/wp-content/uploads/fig1-2-1.png

怪傑CatGPTの解決方法は
いくつかある

問題のコードは入力されたデータを正規表現で置き換えする箇所です。
$stringがNullの場合、値を返せないぞというわけです。

public static function convert_eol( $string ) {
	return preg_replace( "/\r\n|\r|\n/", "\n", $string );
}

さっそくCatGPTに聞いてみました。

方法1: Null チェックを追加
方法2: Null 合体演算子を使用
方法4: 関数をラップする
方法4: 関数をラップする

と4つの方法を怪盗してきました。

その具体的な修正方法は?その一

方法1: Null チェックを追加

`preg_replace()`を呼び出す前に、引数が`null`でないことを確認します。`null`の場合は適切なデフォルト値に置き換えます。

if ($subject === null) {
    $subject = ''; // 例えば、空文字列に置き換える
}

方法2: Null 合体演算子を使用

PHPのNull合体演算子(`??`)を使用して、`null`の場合にデフォルト値を設定します。

$result = preg_replace($pattern, $replacement, $subject ?? '');

その具体的な修正方法は?その二

方法3: 三項演算子を使用
三項演算子を使用して、`null`の場合にデフォルト値を設定します。

<?php
$result = preg_replace($pattern, $replacement, $subject !== null ? $subject : '');

方法4: 関数をラップする

これまでは直接問題の関数を修正していましたが、今度は元の関数を触らずに対応する方法です。
`preg_replace()`をラップする関数を作成し、引数が`null`でないことを保証します。

<?php
//nullの場合に空文字列を入れる新しい関数を作ります。
function safe_preg_replace($pattern, $replacement, $subject) {
    return preg_replace($pattern, $replacement, $subject ?? '');
}

//あとは元の関数を変更することなくラップするだけで対策できます。
$result = safe_preg_replace($pattern, $replacement, $subject);

基本はNullだった場合の初期値を設定するという点は共通
いろいろありますが、要はNullの場合は空文字に置き換えるということです。
スマートなのは2番目の方法でしょうか。
複雑なコードであれば4番目がいいとは思いますが・・・。

Null 合体演算子の解説
Null 合体演算子の解説ページです。PHP.netの方よりMDNの方が詳しくわかりやすく解説してあるので、こちらをリンクします。言語はJSですが内容は同じです。
MDNのNull 合体演算子の解説:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing

為せばNULL。空を渡せば怪傑!

『Nullを引数へ渡せない問題をCatGPTが怪傑』関連のお薦め

このページで紹介しているプログラムやビジュアルなどご依頼いただければ実装を賜ります。
お問い合わせはこちら

Permanent Exhibition