[PHP5 OO] Metodo nativo __toString() ma non scatta

Salve a tutti, come primo post in questo forum, vorrei sottoporvi una strana anomalia.

Ipotiziamo che io ho una classe di questo tipo:

class x

{

  var x;

  function x() { $this->x = "ciao"; }

  public function __toString() { return $this->x }

}

dall'esterno se chiamo:

$test = new x();

echo $test;

il risultato è

ciao

Ma se passo tutto questo a una funzione o a un oggetto che accoda la stringa restituita dall'oggetto x ad una variabile interna ricevo un "PHP Notice: Object of class x to string conversion" e la variabile stringa dell'altra classe ha Object invece del testo convertito... sapete dirmi il perché?

inviato 9 anni fa
Achilleterzo
X 0 X

Riporta un esempio completo dal quale si possa ottenere l'anomalia in oggetto.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie per la risposta ^^

Guarda, te ne ho scritta una stringata per segnalare il problema, addirittura qui và in fatal error:

class Abb
{
   var $name;
   function Abb() { $this->name = "page"; }
   function __toString() { return $this->name; }
}

class accoda
{
   var $text;
   function accoda($var)    {   $this->text = $var;   }
   function getText()      { return $this->text; }
   function __toString()   { return $this->text; }
}

$test = new Abb();
$accoda = new accoda($test);
echo $accoda->getText();
echo $accoda;

la prima istruzione echo stampa page, la seconda risponde così:

PHP Fatal error: Method accoda::__toString() must return a string value

risposto 9 anni fa
Achilleterzo
X 0 X

The __toString() method is currently only called by the print and echo

language constructs

Quindi così non può funzionare, dovresti fare un metodo getText anche per Abb da usare se devi inviare il risultato come parametro.

risposto 9 anni fa
LonelyWolf
modificato 9 anni fa
X 0 X

Prova a cambiare:

function __toString()
{ return $this->text; }

in

function __toString()
{ return (string)$this->text; }

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie per le risposte :)

Allora, no, sfortunamante il casting in string non funziona...

Ho già fatto esperimenti in merito come:

return sprintf($this->text);

return (string) $this->text;

anche le costruttore, quando passo l'oggetto in firma, nulla cambia facendo casting o chiedendo espressamente una stringa:

Nel primo caso non viene convertito, ne con cast (string) ne con funzioni di print...

Nel secondo, ancora non sono implementate le primitive, quindi se metto

function accoda(string $var)

Richiede una classe string... che non esiste.

risposto 9 anni fa
Achilleterzo
X 0 X

Premetto che fare con un metodo getValue(), era un alternativa che volevo evitare.... visto che la maggiorparte dell'oggetto che ho strutturato è strutturato in quel modo....

Ho anche provato a far scattare il toString passando i parametri byRef, invece che per valore, ma non sono riusciro a venirne a capo :S

risposto 9 anni fa
Achilleterzo
X 0 X

Il metodo __toString viene chiamato SOLO dalle istruzioni print ed echo: print $oggetto o echo $oggetto.

Quindi altre alternative non ci sono.

risposto 9 anni fa
LonelyWolf
X 0 X

Eh, me ne rendo conto, ma per come avevo strutturato la cosa, non sò a questo punto se mi convenga continuare con questa linea o fare un array contenente gli elementi,

Grazie comunque :)

risposto 9 anni fa
Achilleterzo
X 0 X

Ok, mi correggo da solo:

__toString

The __toString method allows a class to decide how it will react when it is converted to a string.

....

It is worth noting that before PHP 5.2.0 the __toString  method was only called when it was directly combined with echo() or print(). (manuale inglese)

It is worth noting that the __toString method will only be called when it is directly combined with echo() or print(). (manuale italiano)

Ora dal changelog credo che ti abbiano risolto il problema!

Changed __toString() to be called wherever applicable. (Marcus)

risposto 9 anni fa
LonelyWolf
X 0 X

Aggiornamento del server in atto...

risposto 9 anni fa
Achilleterzo
X 0 X

Meraviglia!!!! con l'aggiornamento tutto funziona egregiamente ^^

risposto 9 anni fa
Achilleterzo
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda