2010-11-14 11 views
1

Hey, j'ai un petit scénario de test comme suit:Retour d'un objet SimpleXML dans le constructeur de la classe - pourquoi cela ne fonctionne-t-il pas?

class T { 
    public function __construct(){ 
     $obj = new SimpleXMLElement(file_get_contents('vote.xml')); 
     return $obj; 
    } 
} 

$vv=new T; 
var_dump($vv); 

La décharge de $vv est égal, dans ce cas, object(T)#1 (0) { } - autrement dit, pas le résultat attendu

Quand je retourner l'objet dans une fonction distincte, bien que, comme ceci:

class T { 
    public function stackOverflow(){ 
     $obj = new SimpleXMLElement(file_get_contents('vote.xml')); // or simplexml_load_file 
     return $obj; 
    } 
} 

$vv=new T; 
$vv = $vv->stackOverflow(); 
var_dump($vv); 

sortie est comme prévu (contenant l'objet contenu du « vote.xml », des étiquettes et des attribu tes). Pourquoi ne puis-je pas renvoyer l'objet à l'intérieur du constructeur? Merci!

Répondre

3

Le constructeur ne retournera jamais qu'une référence à l'objet nouvellement créé. C'est intentionnel - comment d'autre auriez-vous une référence au nouvel objet?

Vous pouvez toutefois créer une propriété d'objet dans votre constructeur, puis y accéder depuis l'extérieur. Cela signifierait que vous créeriez l'objet pendant le processus constructeur, donc cela serait fait au bon moment et, de plus, pourrait être garanti être fait.

class T { 
    public $sxml; 

    public function __construct(){ 
     $this->sxml = new SimpleXMLElement(file_get_contents('vote.xml')); 
    } 
} 

$vv=new T; 
var_dump($vv->sxml); 

Bien sûr, si vous n'avez pas besoin la référence au nouvel objet, vous pouvez utiliser une méthode statique au lieu et ne jamais utiliser le constructeur:

class T { 
    public static function sxml() { 
     return new SimpleXMLElement(file_get_contents('vote.xml')); 
    } 
}