Page 1 sur 1

Dépasser les limites de __tostring

Posté : 31 mai 2006, 21:37
par Discret
Bonjour, voici un court script:
<?php
	
	$xml = simplexml_load_string ("<xml>Valeur</xml>");
	$chaine = "Valeur = " . $xml;
	echo $chaine;
	
	echo "<br/>";
	
	$test = new test;
	$chaine = "Valeur = " . $test;
	echo $chaine;	
	
	class test {
		public function __toString () {
			return "Valeur";
		}
	}
	
?>
On remarque que la fonction __tostring semble fonctionner même si non utilisé directement dans un echo.
Comment faire ceci pour ma classe test ? (Si cela est possible).


Bonne soirée.

Posté : 31 mai 2006, 22:38
par Hubert Roksor
Ce n'est pas possible désolé. Je sais, c'est pas logique... :| Tu peux espérer que ça fonctionne comme tu le souhaites dans PHP 5.2 (mais jamais dans PHP 5.1).

Si ça peut te consoler, même si ça
echo "Valeur = " . $test;
ou ça
echo "Valeur = $test";
ne marche pas,
echo "Valeur = ", $test;
fonctionne.

C'est une maigre consolation :roll:

Posté : 04 juin 2006, 15:30
par rami
Issu de la doc :
Il est important de noter que la méthode __toString ne sera appelée que si elle est directement combinée avec echo() ou print().
<?php
// __toString appelée
echo $class;

// __toString appelée (reste un paramètre normal pour echo)
echo 'text', $class;

// __toString non appelée (opérateur de concaténation utilisé en premier)
echo 'text' . $class;

// __toString non appelée (conversion en une chaîne de caractères en premier)
echo (string) $class;

// __toString non appelée (conversion en une chaîne de caractères en premier)
echo "text $class";
?> 

Re: Dépasser les limites de __tostring

Posté : 04 juin 2006, 16:01
par Hubert Roksor
En fait je pense que Discret a déjà lu la doc puisqu'il la cite.
On remarque que la fonction __tostring semble fonctionner même si non utilisé directement dans un echo.
Si vous voulez suivre la discussion actuelle entre les développeurs de PHP et les conséquences d'activer __toString() à chaque fois qu'un objet est utilisé comme une chaîne: http://marc.theaimsgroup.com/?t=114933525100005&r=1&w=2