web-dev-qa-db-fra.com

PHP Erreur fatale: impossible d'accéder à une propriété vide

Je suis nouveau sur php et j'ai exécuté le code ci-dessous.

<?php
class my_class{

    var $my_value = array();
    function my_class ($value){
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->$my_value = $value;

    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');

foreach ($a->my_value as &$value) {
    echo $value;
}

?>

J'ai des erreurs en dessous. Quelle pourrait être l'erreur?

Notice: Undefined variable: my_value in C:\xampp\htdocs\MyTestPages\f.php on line 15

Fatal error: Cannot access empty property in C:\xampp\htdocs\MyTestPages\f.php on line 15
61
Bishan

Vous accédez à la propriété de la mauvaise façon. Avec le $this->$my_value = .. _ syntaxe, vous définissez la propriété avec le nom de la valeur dans $ my_value. Ce que tu veux c'est $this->my_value = ..

$var = "my_value";
$this->$var = "test";

est le même que

$this->my_value = "test";

Pour corriger quelques points de votre exemple, le code ci-dessous est un meilleur outil.

class my_class {

    public  $my_value = array();

    function __construct ($value) {
        $this->my_value[] = $value;
    }

    function set_value ($value) {
        if (!is_array($value)) {
            throw new Exception("Illegal argument");
        }

        $this->my_value = $value;
    }

    function add_value($value) {
        $this->my_value = $value;
    }
}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->add_value('c');
$a->set_value(array('d'));

Cela garantit que my_value ne changera pas son type en chaîne ou autre chose lorsque vous appelez set_value. Mais vous pouvez toujours définir la valeur de my_value direct, car elle est publique. La dernière étape consiste à rendre my_value privé et à accéder uniquement à my_value via les méthodes getter/setter

172
Philipp

Tout d'abord, ne déclarez pas les variables en utilisant var, mais

public $my_value;

Ensuite, vous pouvez y accéder en utilisant

$this->my_value;

et pas

$this->$my_value;
31
Marko D

Pour accéder à une variable dans une classe, vous devez utiliser $this->myVar au lieu de $this->$myvar.

Et, vous devez utiliser l'identifiant d'accès pour déclarer une variable au lieu de var.

Veuillez lire le doc ici .

10
Val

Comme je le vois dans votre code, il semble que vous suiviez un ancien tutoriel/documentation sur OOP dans PHP basé sur PHP4 (la POO n'était pas prise en charge mais adaptée). être utilisé de manière simple), depuis PHP5, un support officiel a été ajouté et la notation a été modifiée.

S'il vous plaît voir cette revue de code ici:

<?php
class my_class{

    public $my_value = array();

    function __construct( $value ) { // the constructor name is __construct instead of the class name
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->my_value = $value; // remove the $ sign
    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c'); // your array variable here will be replaced by a simple string 
// $a->my_class('d'); // you can call this if you mean calling the contructor 


// at this stage you can't loop on the variable since it have been replaced by a simple string ('c')
foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well
    echo $value;
}

?>

J'espère que ça aide

5
Abu Romaïssae

Intéressant:

  1. Vous avez déclaré un tableau var $my_value = array();
  2. Valeur ajoutée dedans $a->my_value[] = 'b';
  3. Assigné une chaîne à variable. (donc ce n'est plus un tableau) $a->set_value ('c');
  4. Essayé de pousser une valeur dans un tableau, qui n'existe plus. (c'est une chaîne) $a->my_class('d');

Et votre foreach ne fonctionnera plus.

1
vikingmaster

De cette façon, vous pouvez créer un nouvel objet avec un nom de propriété personnalisé.

$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);

Maintenant, vous pouvez y accéder comme ceci:

echo $a->foo;  //returns bar
1
gazdagergo

Je me rends compte que cette réponse n’est pas une réponse directe au problème décrit par l’OP, mais j’ai trouvé cette question à la suite de la recherche du même message d’erreur. Je pensais que ça valait le coup de poster mon expérience ici, juste au cas où quelqu'un s'embrouillerait pour la même chose ...

Vous pouvez rencontrer l'erreur en question à la suite d'une boucle mal formatée for sur un tableau associatif. Dans un accès de tête, j'utilisais -> au lieu de => dans mon for:

        foreach ($object->someArray as $key->$val) {
            // do something
        }

Bien sûr, j'aurais dû avoir:

        foreach ($object->someArray as $key=>$val) {
            // do something
        }

Je me suis confondu au début, pensant que l'erreur signalée se rapportait à la propriété someArray!

0
John Rix