2013-02-17 4 views
54

Sono nuovo a php e ho eseguito il codice di seguito.Errore irreversibile PHP: impossibile accedere alla proprietà vuota

<?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; 
} 

?> 

Ho ottenuto errori di sotto. Quale potrebbe essere l'errore?

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 
+9

Se sei solo imparando PHP, cercare qualche tutorial più up-to-date ... l'uso di 'var' e un metodo con lo stesso nome della classe indica un tutorial vecchio stile, obsoleto –

+0

@MarkBaker, grazie per le tue istruzioni. – Bishan

risposta

159

Accedi alla proprietà nel modo sbagliato. Con la sintassi $this->$my_value = .., si imposta la proprietà con il nome del valore in $ mio_valore. Quello che vuoi è $this->my_value = ..

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

è lo stesso di

$this->my_value = "test"; 

Per risolvere un paio di cose dal vostro esempio, il codice qui sotto è un aproach meglio

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')); 

Ciò assicura, che my_value non cambierà il suo tipo in stringa o qualcos'altro quando chiami set_value. Ma puoi comunque impostare direttamente il valore di my_value, perché è pubblico. Il passaggio finale consiste nel rendere my_value privato e accedere a my_value solo sui metodi getter/setter

+0

Quindi ho ricevuto un messaggio di errore "Errore irreversibile: [] operatore non supportato per le stringhe in C: \ xampp \ htdocs \ MyTestPages \ f.php nella riga 12'. La riga 12 è '$ this-> my_value [] = $ value;' – Bishan

+0

Sure .. set_value cambia il tipo da my_value da array a stringa. Probabilmente vuoi cambiare il codice all'interno di set_value in $ this-> my_value [] = $ value; ' – Philipp

+0

Grazie Philipp. – Bishan

9

Per accedere a una variabile in una classe, è necessario utilizzare $this->myVar anziché $this->$myvar.

E, è necessario utilizzare l'identificatore di accesso per dichiarare una variabile anziché var.

Leggere il documento here.

+0

Allora ho ricevuto un messaggio di errore "Errore irreversibile: [] operatore non supportato per le stringhe in C: \ xampp \ htdocs \ MyTestPages \ f.php nella riga 12'. La riga 12 è '$ this-> my_value [] = $ value;' – Bishan

+0

Non puoi chiamare '$ this-> my_value []' dovresti avere un valore in '[]'. – Val

27

In primo luogo, non si dichiara variabili utilizzando var, ma

public $my_value; 

Poi è possibile accedervi utilizzando

$this->my_value; 

e non

$this->$my_value; 
1

Interessante:

  1. Si dichiarato una matrice var $my_value = array();
  2. valore Spinto in esso $a->my_value[] = 'b';
  3. assegnata una stringa variabile. (quindi non è più array) $a->set_value ('c');
  4. Ho provato a inserire un valore in array, che non esiste più. (È stringa) $a->my_class('d');

E il tuo foreach non funzionerà più.

5

Come si vede nel codice, sembra che si stia seguendo una vecchia documentazione/tutorial su OOP in PHP basato su PHP4 (OOP non è stato supportato ma adattato in qualche modo per essere utilizzato in un modo semplice), poiché PHP5 è un funzionario è stato aggiunto il supporto e la notazione è stata modificata da quello che era.

Si prega di vedere questa recensione qui il codice:

<?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; 
} 

?> 

Spero che aiuta

0

Mi rendo conto che questa risposta non è una risposta diretta al problema descritto dal PO, ma ho trovato questa domanda come risultato della ricerca dello stesso messaggio di errore. Ho pensato che vale la pena di postare la mia esperienza qui nel caso in cui qualcuno stesse confondendo la stessa cosa ...

È possibile riscontrare l'errore in questione a causa di un ciclo for scarsamente formattato su un array associativo. In un impeto di osso di testa, stavo usando -> al posto di => a mio for dichiarazione:

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

Naturalmente, avrei dovuto:

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

mi sono confuso in un primo momento, pensando che l'errore segnalato si riferiva alla proprietà someArray!

1

In questo modo è possibile creare un nuovo oggetto con un nome di proprietà personalizzato.

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

Ora si può raggiungere piace:

echo $a->foo; //returns bar 
+0

sarebbe stato più dettagliato ..! – Chella