Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.
  • 環境
    • 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) "パースレー"
}
ponsuke0531
びっくりするほど物覚えが悪いが、エンジニアを目指しています。
http://ponsuke-tarou.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away