TUTORIAL: La magie de __toString ()

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Mars 12th, 2009, 7:57 pm

Introduction


Youve probablement entendu parler de " Méthodes magiques "Si youve fait rien du tout avec [acronyme = Object Oriented Programming: 3uv30xo7] POO [/acronym] dans [acronyme = Hypertext préprocesseur: 3uv30xo7] PHP [/acronym] . Très probablement le __construct () qui est invoqué lors de l'initialisation d'une instance d'une classe youve définis.

Alors que __construct () est officieusement une méthode magique qui doit être définie lors de l'écriture des classes, __toString () est facultative dans tous les sens du terme et est souvent négligé au profit d'écrire des méthodes destinées à être invoquée pour le seul motif que de retourner un chaîne lisible par l'homme.

Theres rien de mal à faire cela, mais si vous pouvez obtenir vos objets pour retourner une chaîne lisible par un humain sans avoir à taper quoi que ce soit plus que les $ "objet" de référence au lieu de "$ object-> method ()", pourquoi ne pas avoir à le faire cela?

Les concepts dans ce tutoriel s'applique à [acronyme = Hypertext préprocesseur: 3uv30xo7] PHP [/acronym] version 5.2 ou plus récent. En raison de limitations dans le contexte que [= acronyme Hypertext préprocesseur: 3uv30xo7] PHP [/acronym] invoqué la méthode magique __toString avant [acronyme = Hypertext préprocesseur: 3uv30xo7] PHP [/acronym] 5.2, les exemples contenus dans ce tutoriel mai pas travailler dans ces anciennes versions.

Des exemples d'utilisation


Permet de comparer un exemple en utilisant à la fois pratique courante, et en utilisant __toString.

Tout d'abord un exemple en utilisant une pratique courante pour charger un fichier CSV et l'imprimer comme un [acronyme = Hyper Text Markup Language: 3uv30xo7] HTML [/acronym] <table>.
PHP Code: [ Select ]
<?php
 
$data_table = new csv_html('file.csv');
echo '<h2>Data Table</h2>' . $data_table->html_table();
 
?>
  1. <?php
  2.  
  3. $data_table = new csv_html('file.csv');
  4. echo '<h2>Data Table</h2>' . $data_table->html_table();
  5.  
  6. ?>


Maintenant passons à regarder ce même exemple, si __toString avait été défini à la place du "html_table ()" method.
PHP Code: [ Select ]
<?php
 
$data_table = new csv_html('file.csv');
echo "<h2>Data Table</h2>$data_table";
 
?>
  1. <?php
  2.  
  3. $data_table = new csv_html('file.csv');
  4. echo "<h2>Data Table</h2>$data_table";
  5.  
  6. ?>


Un exemple plus utile d'instanciation peut être anonyme, en l'absence de référence à l'objet est conservée. Ceci est utile si un objet est un formateur de simple et ne sera probablement jamais manipulé de l'instanciation.
PHP Code: [ Select ]
<?php
 
printf('<h2>Data Table</h2>%s', new csv_html('file.csv'));
 
?>
  1. <?php
  2.  
  3. printf('<h2>Data Table</h2>%s', new csv_html('file.csv'));
  4.  
  5. ?>


So How do I __toString Mettre en œuvre et #40; & #41;?


Exactement de la même façon que vous définissez votre __construct () méthode, et l'une des autres méthodes magiques, à l'exception de __autoload ().
En tant que public méthode au sein de votre définition de classe.

Voici un exemple, même si un brut un, de la façon dont la classe dans l'exemple CSV peut être écrite.
PHP Code: [ Select ]
<?php
 
class csv_html
{
    public $filename, $csv;
    public function __construct($filename)
    {
        $this->filename = $filename;
        $this->csv = file_get_contents($filename);
        return $this;
    }
    public function __toString()
    {
        return sprintf(
            '<table><tr><td>%s</td></tr></table>',
            str_replace(array("\n", ','), array('</tr><tr>', '</td><td>'), $this->csv)
        );
    }
}
 
?>
  1. <?php
  2.  
  3. class csv_html
  4. {
  5.     public $filename, $csv;
  6.     public function __construct($filename)
  7.     {
  8.         $this->filename = $filename;
  9.         $this->csv = file_get_contents($filename);
  10.         return $this;
  11.     }
  12.     public function __toString()
  13.     {
  14.         return sprintf(
  15.             '<table><tr><td>%s</td></tr></table>',
  16.             str_replace(array("\n", ','), array('</tr><tr>', '</td><td>'), $this->csv)
  17.         );
  18.     }
  19. }
  20.  
  21. ?>


Maintenant, vous pourriez demander: « Pourquoi ne pas avoir juste le retour du constructeur [= acronyme Hyper Text Markup Language: 3uv30xo7] HTML [/acronym] ? ».
Parce qu'il ferait ce qui va devenir votre pare pas constructeur de classe inutile si vous avez déjà essayé d'étendre la classe, thats why.

Conclusion


Donnez __toString () un essai, vous pourriez juste ça.
Moderator Remark: Noted __autoload exception
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Mars 12th, 2009, 7:57 pm

  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Juin 30th, 2009, 7:00 pm

Ah oui, et les constructeurs public sont généralement considérées comme le mal si la classe a des propriétés qui doivent être fixées, d'où la Factroy Patterns :)

Quant à la toString (), j'ai accepté, sans doute le plus sous estimé, en vertu de la méthode utilisée sur la planète.

Je trouve l'utiliser (à moins que les exigences dicter autrement) fournit une méthode pour générer soigné lisible par l'homme d'identification pour le dit objet.

L'autre bonne chose est que comme le C #Java et l'invoquer automatiquement lors de lier les objets à l'interface des objets de propriété Text de l'ISU.

Nice to see PHP supporte aussi bien :)
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juin 30th, 2009, 11:49 pm

Je pense que PHP lancera une erreur fatale si les constructeurs sont définis comme étant autre chose que du public.

Im pas un grand fan d'un grand nombre de modèles de conception en usage aujourd'hui, je reculer tout le temps, j'ai lu le mot "usine". La plupart d'entre elle semble être un peu plus, il complique les choses pour moi. :)
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Juillet 1st, 2009, 1:48 am

Je suis un grand fan de la structure :) Surtout avec les runtimes Java et. NET. Singletons tht jazz et tous les
Watch me grow

Afficher de l'information

  • Total des messages de ce sujet: 4 messages
  • Modérateur: Tutorial Writers
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC