【PHP】PHP7.4からPHP8.3へのバーションアップ

その他

概要

PHP7.4からPHP8.3へのバーションアップする際、留意することをまとめておきます。

内容

(1)PHP8.0.0 から、デフォルト値を設定した引数が変更

PHP8.0.0 から、デフォルト値を設定した引数の後ろに必須の引数を持ってきた場合は、デフォルト値を設定した引数のデフォルト値がなくなり、必須の引数として振る舞うこととなったようです。

<?php 
  // $var2 の引数の前に $var のデフォルト値を設定した引数があるのでエラー文が表示される
  function foo($param = '', $param2) {}

  // こうすればよい
  function foo($param, $param2) {}
  function foo($param2, $param = '') {}

(2)変数がNULLの可能性がある場合、エラーとなる。

PHP7.4では、うまく動作していたが、PHP8.3ではエラー。

PHP Deprecated:  str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in

--------------------------------------------
function stripComma($val){ 
	$value = str_replace(",", "", $val);
	return $value;
}
-------------------------------------------
↓↓↓
-------------------------------------------
function stripComma($val){
	if($val == null){
		return "";
	} 
	$value = str_replace(",", "", $val);
	return $value;
}
--------------------------------------------

(3)0割

PHP Fatal error: Uncaught DivisionByZeroError: Division by zero のメッセージが出力され、エラーとなる。

例えば、以下のように事前にかどうか判定すれば良い。

0割をするとエラーになる。
if($mother != 0) {
  $ret = $chid / $mother;
}else{
  $ret = 0;
}

(4)金額のカンマ区切り

金額のカンマ区切り、文字列の表示などを行う場合はnumber_formatをラッピングしたapi_number_formatが使える。

PHP8.3では数字でないものをnumber_formatで使用するとエラーになるため。

function api_number_format($number,$number_decimal = 0)
{
  if(is_numeric($number)) {
      return number_format($number,$number_decimal);
  }else{
      return  $number;
  }
}

echo api_number_format("100.123456",3) . "\n";  → 100.123
echo api_number_format("100000") . "\n";    → 100,000
echo api_number_format("ABC") . "\n";           → ABC
echo api_number_format("") . "\n";              →