2010-10-14 15 views
4

Si une classe implémentant le code HTML d'une page est créée en la construisant et en appelant différentes méthodes, est-il approprié de définir la partie affichage/écho de la classe dans le destructeur? Au lieu d'avoir une méthode explicite Class:displayHTML();, avoir le echo $this->html dans le destructeur et chaque fois que vous êtes prêt à afficher appel unset($object); qui l'afficherait?L'utilisation de php destructor est-elle appropriée pour afficher du code HTML?

Je sais que le destructeur n'est probablement pas le meilleur endroit pour cela, mais je me demande ce que d'autres pensent à ce sujet?

+6

pourquoi obscurcir son propre code? –

Répondre

10

Cela ne me semble pas faisable. unset n'est pas égal à l'écho. C'est une chose fondamentalement différente. De plus, gardez à l'esprit que les objets ne sont pas seulement détruits sur unset mais aussi lorsqu'ils ne sont plus référencés et/ou lorsque le script se termine. Cela a beaucoup de potentiel pour les effets secondaires indésirables.

Si vous ne voulez pas avoir/appelez une méthode displayHTML() ou render(), implémentez cette partie dans __toString() et renvoyez simplement l'instance.

class HTMLSomething 
{ 
    /* ... */ 
    public function __toString() 
    { 
     /* create $output */ 
     return $output; 
    } 
} 
$something = new HTMLSomething; 
echo $something; 
+1

100% d'accord et +1 – Hannes

+1

J'ai complètement oublié la méthode __toString. Très bonne réponse. – Chris

+0

également, le __deconstruct() est également appelé lorsque le script se termine, donc même sans le désactiver, il serait appelé, ce qui pourrait conduire à un comportement étrange – Hannes

6

Lequel de ces deux a un résultat plus évident?

unset($object); 

ou:

$object->displayHTML(); 

penser à cela, puis aller lire sur le Principle of Least Astonishment.

+1

D'accord. Avoir la sortie HTML du destructeur est un résultat complètement inattendu. – meagar

+0

Ceci est un excellent lien de référence et je voudrais pouvoir accepter deux réponses! – Chris

1

Cela semble être une mauvaise idée. Je ne vois pas vraiment ceci:

unset($view); 

comme meilleur que ce

$view->displayHTML(); 

Il semble que le seul avantage réel est que vous avez vraiment pas besoin d'appeler unset() (depuis la fin de la script qui devrait arriver).

Cependant, est-ce vraiment une bonne chose? Comment alors empêchez-vous qu'il soit affiché? Une fois que c'est réglé, vous ne pouvez pas. Ou vous auriez besoin d'une fonction spéciale clear() pour désactiver la sortie avant qu'elle ne soit générée automatiquement par le destructeur.

Pour moi, je ne vois pas d'avantage ici.

1

Ce n'est pas la voie à suivre car vous n'avez pas un contrôle complet sur votre destructeur. Le destructeur sera appelé lorsque votre script sera terminé, mais vous ne voudrez peut-être rien afficher sous certaines conditions (disons: charger, valider, la validation échoue, afficher autre chose). Comme le soulignait Dominic, il y a aussi la question de la lisibilité. Vous ne voulez pas lire votre code un an plus tard et dire: Pourquoi ai-je désactivé l'objet? WTF étais-je penser à l'époque ?!. Comme vous pouvez le voir, cela augmentera le ratio WTF/minute et nous savons tous que c'est une mauvaise chose.