回答:
新しい環境では、PHPバージョン<= 5.3.xでE_STRICT
警告が有効になっているerror_reporting
かerror_reporting
、少なくともE_WARNING
PHPバージョン> = 5.4で警告が設定されている可能性があります。そのエラーは、$res
がNULL
まだ初期化されていない場合にトリガーされます。
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP $res
がすでに何らかの値に初期化されているがオブジェクトではない場合、別のエラーメッセージが報告されます。
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
E_STRICT
PHP 5.4より前の標準、またはPHPの通常のE_WARNING
エラーレベル> = 5.4 に準拠するには、汎用オブジェクトを作成してプロパティを割り当てようとしていると想定して、グローバルネームスペースでのオブジェクトとしてsuccess
宣言する必要があります。$res
stdClass
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();
。それ以外の場合、このコードは「古いPHP」の暗黙的なオブジェクト作成に代わるものではありません。
このメッセージはE_STRICT
、PHP 5.3以降用です。PHP 5.4以降、残念ながらに変更されましたE_WARNING
。E_WARNING
メッセージは便利なので、完全に無効にする必要はありません。
この警告を取り除くには、次のコードを使用する必要があります。
if (!isset($res))
$res = new stdClass();
$res->success = false;
これは完全に同等の置き換えです。これは、PHPが静かに行っていることとまったく同じことを保証します-現在は警告なしで不愉快に-暗黙的なオブジェクトの作成。存在しないことが確実でない限り、オブジェクトがすでに存在するかどうかを常に確認する必要があります。Michaelが提供するコードは、状況によっては、オブジェクトがコード内の同じ場所ですでに定義されている場合があるため、一般的には良くありません。
Undefined variable: res
。
単に、
$res = (object)array("success"=>false); // $res->success = bool(false);
または、次のようにしてクラスをインスタンス化することもできます。
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
値を入力してください:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
詳細情報:https : //www.php.net/manual/en/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();
、うまくいかない場合でも、警告が表示されます。注:$this->route
は存在します。
「@」文字を行の先頭に置くと、PHPはこの行に対して警告/通知を表示しません。例えば:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
この行に対するこの警告を防ぐには、次のように「@」文字を行の先頭に置く必要があります。
@$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20
私は開発時にこのトリックを使用しています。警告を正しく処理しないとすべての警告メッセージを無効にしたくないので、今後大きなエラーになります。
配列があり、それにオブジェクトを追加する場合は、これを試してください。
$product_details = array();
foreach ($products_in_store as $key => $objects) {
$product_details[$key] = new stdClass(); //the magic
$product_details[$key]->product_id = $objects->id;
//see new object member created on the fly without warning.
}
これは、後で使用するためにオブジェクトの配列を送信します〜!
これを試して:
ini_set('error_reporting', E_STRICT);
E_STRICT
、致命的なエラーのメッセージの抑制を含む、エラーを除くすべてのエラー報告を無効にします。これは、この特定の警告を解決するための妥当な提案ではありません。さらに、あなたがしたくないことはほとんどありません。なぜ5人がこれに賛成したのか、私には手掛かりがありません。
ini_set('error_reporting', -1);
デバッグ中に、しかし、これまでのように、上記使用しないでください。
同様の問題があり、これで問題が解決したようです。$ resオブジェクトをクラスに初期化するだけです。ここでクラス名がtestであるとします。
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
これは私がPHP 7で直面した警告です。これを簡単に修正するには、使用する前に変数を初期化します
$myObj=new \stdClass();
初期化したら、オブジェクトに使用できます
$myObj->mesg ="Welcome back - ".$c_user;
この問題は、開始されていないオブジェクトのインスタンスに割り当てているために発生します。たとえば:
あなたの場合:
$user->email = 'exy@gmail.com';
解決:
$user = new User;
$user->email = 'exy@gmail.com';
変数が宣言され、型が正しいかどうかを確認する必要がある場合があります。
if (!isset($res) || !is_object($res)) {
$res = new \stdClass();
// With php7 you also can create an object in several ways.
// Object that implements some interface.
$res = new class implements MyInterface {};
// Object that extends some object.
$res = new class extends MyClass {};
}
$res->success = true;
PHPの匿名クラスを参照してください。
APIから返されたオブジェクトに変数を追加しようとしたときに、同様の問題が発生しました。私はforeachループでデータを反復処理していました。
foreach ( $results as $data ) {
$data->direction = 0;
}
これにより、Laravelで「空の値からのデフォルトオブジェクトの作成」例外がスローされました。
非常に小さな変更で修正しました。
foreach ( $results as &$data ) {
$data->direction = 0;
}
$ dataを参照にするだけです。
それが誰かを助けてくれることを願っています。
オブジェクトに成功値を追加すると作成されます。指定しない場合、デフォルトのクラスが継承されます。
使ってみてください:
$user = (object) null;
$res
ますか?