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.