352 votes

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. L'erreur pointe vers cette ligne de code:

Erreur:

 Creating default object from empty value
 

code:

 $res->success = false;
 

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

606voto

Michael Berkowski Points 137903

Votre nouvel environnement peut avoir E_STRICT avertissements activé en error_reporting si c'est PHP <= 5.3, ou si tout simplement error_reporting d'au moins E_WARNING avec PHP 5.4+. . Cette erreur est déclenchée lors de l' $res est NULL ou pas encore initialisé:

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

PHP le signale par un message d'erreur différent si $res est déjà initialisé à une certaine valeur, mais n'est pas un objet:

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

Afin de respecter E_STRICT normes antérieures à PHP 5.4, ou la normale E_WARNING niveau d'erreur de PHP >= 5.4, en supposant que vous essayez de créer un objet générique, et d'attribuer la propriété success, vous devez déclarer $res comme un objet d' stdClass:

$res = new stdClass();
$res->success = false;

52voto

TMS Points 17522

Ce message a été E_STRICT PHP <= 5.3. Depuis PHP 5.4, il a été unluckilly changé d' E_WARNING. Depuis E_WARNING des messages sont utiles, vous ne voulez pas de les désactiver complètement.

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

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

$res->success = false;

C'est entièrement de remplacement équivalente. Il assure exactement la même chose que PHP est silencieusement le faire, malheureusement avec avertissement maintenant - la création d'objet implicite. Vous devriez toujours vérifier si l'objet existe déjà, sauf si vous êtes absolument sûr qu'il ne l'est pas. Le code fourni par Michael n'est pas bon en général, parce que, dans certains contextes, l'objet peut parfois être déjà défini au même endroit dans le code, selon les circonstances.

1voto

Irfan Dayan Points 635

Essaye ça:

 ini_set('error_reporting', E_STRICT);
 

-1voto

Silvertiger Points 1150

Non, vous ne le ferez pas. Cela le créera lorsque vous ajouterez la valeur de succès à l'objet. La classe par défaut est héritée si vous n'en spécifiez pas.

-1voto

Cette erreur peut également être déclenchés si vous essayez d'accéder à une propriété privée d'un parent de la classe, et la classe qui est en train d'essayer d'accéder à cette propriété privée est la magie de la méthode __get, et vous n'avez pas affecté de votre propriété avec l' __jeu la magie de la méthode (ou au moins, affecté à la propriété à la même place l' __jeu de le mettre).

Imaginez quelque chose comme ceci:

class Object {

  private $attributes = array();

  public function __set($name, $value) {
    $this->attributes[$name] = $value;
  }

  public function __get($name) {
    return $this->attributes[$name];
  }
}

class Vehicle extends Object {

  private $owner;

  public function SetOwner(User $user) {
    $this->owner = $user;
    $this->owner->vehicles[$this->id] = $this;
  }
}

class Car extends Vehicle {

  public function __construct(User $user) { // this doesn't make sense, just to show
    $this->SetOwner($user);
    $this->owner->vehicles[$this->id]->type= 'Car';
  }
}

Ce code est très pauvre, mais assez simple pour rapidement montrer un problème similaire que j'ai eu. Lorsque vous construisez une Voiture, vous passez de son propriétaire (je sais que cela n'a aucun sens), considérant que le propriétaire est un objet Utilisateur. Lorsque vous appelez $this->SetOwner($utilisateur), la catégorie de Véhicule attribuer le $user de l'objet à la propriété privée $propriétaire, et ajoute de ce Véhicule pour les véhicules des propriétaires de la liste. Lorsque vous essayez d'accéder à cette propriété à l'intérieur de la classe de Voiture, de définir son type, vous devriez obtenir une Fatale Erreur "Impossible d'accéder à la propriété privée...". Mais aussi longtemps que vous étendez la classe de l'Objet, et aussi les méthodes magiques __get et __set, en interne, php va essayer de retourner quelque chose comme $this->attributs['propriétaire'], qui est NULLE.

Puis vous vous retrouvez dans la même erreur Michael a dit ci-dessus, vous tentez d'accéder à une propriété (dans ce cas, les véhicules[$this->id]) d'une variable de type NULL. Ceci peut être corrigé si vous définissez l' $propriétaire variable protégé ou public.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X