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
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
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;
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 .
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
Intéressant:
var $my_value = array();
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');
Et votre foreach
ne fonctionnera plus.
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
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!