web-dev-qa-db-fra.com

Créer un objet par défaut à partir d'une valeur vide en PHP?

Je ne vois cette erreur qu'après la mise à niveau de mon environnement PHP vers PHP 5.4 et versions ultérieures. L'erreur pointe vers cette ligne de code:

Erreur:

Création d'objet par défaut à partir d'une valeur vide

Code:

$res->success = false;

Dois-je d'abord déclarer mon objet $res?

309
Paul

Votre nouvel environnement peut avoir E_STRICT warnings activé dans error_reporting pour PHP versions <= 5.3.x, ou simplement avoir error_reporting défini à au moins E_WARNING avec PHP versions> = 5.4 . Cette erreur est déclenchée lorsque $res est NULL ou pas encore initialisé:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

PHP signalera un message d'erreur différent si $res est déjà initialisé à une valeur quelconque mais n'est pas un objet:

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

Afin de respecter les normes E_STRICT antérieures à PHP 5.4 ou au niveau d'erreur normal E_WARNING dans PHP> 5.4, en supposant que vous tentiez de créer un objet générique et d'assigner la propriété success. , vous devez déclarer $res en tant qu’objet de stdClass dans l’espace de nom global:

$res = new \stdClass();
$res->success = false;
528
Michael Berkowski

Ce message a été E_STRICT pour PHP <= 5.3. Depuis PHP 5.4, il a malheureusement été changé en E_WARNING. Puisque les messages E_WARNING sont utiles, vous ne voulez pas les désactiver complètement.

Pour vous débarrasser de cet avertissement, vous devez utiliser ce code:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

Ceci est remplacement totalement équivalent . Cela assure exactement la même chose que PHP fait silencieusement - malheureusement avec avertissement maintenant - la création implicite d'objets. Vous devriez toujours vérifier si l'objet existe déjà, à moins que vous ne soyez absolument sûr que ce ne soit pas le cas. En règle générale, le code fourni par Michael n'est pas utile, car dans certains contextes, l'objet peut parfois être déjà défini au même endroit dans le code, selon les circonstances.

42
TMS

Simplement,

    $res = (object)array("success"=>false); // $res->success = bool(false);

ou

    $res = (object)array(); // object(stdClass)

    $res = new stdClass();  // old method

et

    $res->success = !!0;    // bool(false)

    $res->success = false;  // bool(false)

    $res->success = (bool)0; // bool(false)
9
pirs

Essaye ça:

ini_set('error_reporting', E_STRICT);
4
Irfan Dayan

Si vous mettez le caractère "@" au début de la ligne, alors PHP ne montrera aucun avertissement/avis pour cette ligne. Par exemple:

$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value

Pour éviter cet avertissement pour cette ligne, vous devez mettre le caractère "@" au début de la ligne comme ceci:

@$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

J'utilise cette astuce lors du développement. Je n'aime pas désactiver tous les messages d'avertissement car si vous ne gérez pas correctement les avertissements, ils deviendront une grosse erreur à l'avenir.

3
kodmanyagha

Essayez ceci si vous avez un tableau et ajoutez-y des objets.

$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.
}

Ceci envoieTABLEAUde Objets pour une utilisation ultérieure ~!

2
danielad

Un moyen simple d’obtenir cette erreur est de taper (a) ci-dessous, ce qui signifie taper (b)

(a)$this->my->variable

(b)$this->my_variable

Trivial, mais très facilement négligé et difficile à repérer si vous ne le cherchez pas.

1
Tannin

J'ai eu un problème similaire en essayant d'ajouter une variable à un objet renvoyé par une API. Je parcourais les données avec une boucle foreach.

foreach ( $results as $data ) {
    $data->direction = 0;
}

Cela a déclenché l'exception "Création d'un objet par défaut à partir d'une valeur vide" dans Laravel.

Je l'ai corrigé avec un très petit changement.

foreach ( $results as &$data ) {
    $data->direction = 0;
}

En faisant simplement de $ data une référence.

J'espère que ça aide quelqu'un et que ça m'a énervé!

0
Andy

J'ai eu le même problème et cela semble résoudre le problème. Il vous suffit d'initialiser l'objet $ res à une classe. Supposons ici que le nom de la classe est test.

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
0

Essayez d'utiliser: 

$user = (object) null;
0
Fischer Tirado

Vous devrez peut-être vérifier si la variable a été déclarée et si son type est correct.

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;

Voir PHP classes anonymes .

0
Anton Pelykh

Ce problème est dû au fait que vous affectez une instance d'objet non initiée. Par exemple:

Ton cas:

$user->email = '[email protected]';

Solution:

$user = new User;
$user->email = '[email protected]';
0
Bastin Robin