stdClassをnewしたらPHP Warning: Creating default object from empty value inとなったときの対応方法


  • 環境


    • macOS Mojave バージョン10.14.3

    • PHP 7.3.1

    • Laravel Framework 5.7.26




事象 : stdClassをnewしたら警告が出た


controlStdClassArray.php

<?php

namespace App;

class controlStdClassArray
{
public function createStdClassArrayNew(): array
{
$stdobj = new \stdClass();
$stdobj->name = 'イタリアンパセリ';
$stdObj->otherName = 'パースレー';
return $stdobj;
}
}

$clas = new controlStdClassArray();
var_dump($clas->createStdClassArrayNew());


$ php controlStdClassArray.php 

PHP Warning: Creating default object from empty value in /path/to/tryPhp/app/controlStdClassArray.php on line 24

Warning: Creating default object from empty value in /path/to/tryPhp/app/controlStdClassArray.php on line 24
object(stdClass)#2 (1) {
["name"]=>
string(24) "イタリアンパセリ"
}


原因 : 変数名の大文字と小文字が間違っているから

恥ずかしい原因ですがかなり気が付かずに調べたので。


PHP: 基本的な事 - Manual

変数名は大文字小文字を区別します。


よって、$stdObj->otherName = 'パースレー';は初期化しないで実行されることとなります。

PHP5.3以降ではstdClassをnew(初期化)しないで実行すると怒られるようになりました。


  • PHP5.3 : PHP Strict Standards: Creating default object from empty value

  • PHP5.4以降 : PHP Warning: Creating default object from empty value

PHP5.4からは即時stdClass生成がWarningエラーを吐くようになった話 | ブログ :: Web notes.log


controlStdClassArray.php

// 省略

$stdobj = new \stdClass(); // $stdobjの「o」が小文字
$stdobj->name = 'イタリアンパセリ';
$stdObj->otherName = 'パースレー'; // $stdobjの「o」が大文字
return $stdobj;
// 省略


対応 : 同じ変数は大文字小文字を合わせる


controlStdClassArray.php

// 省略

$stdObj = new \stdClass();
$stdObj->name = 'イタリアンパセリ';
$stdObj->otherName = 'パースレー';
return $stdobj;
// 省略

$ php controlStdClassArray.php 

object(stdClass)#2 (2) {
["name"]=>
string(24) "イタリアンパセリ"
["otherName"]=>
string(15) "パースレー"
}