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
$data_table = new csv_html('file.csv');
echo '<h2>Data Table</h2>' . $data_table->html_table();
?>
- <?php
-
- $data_table = new csv_html('file.csv');
- echo '<h2>Data Table</h2>' . $data_table->html_table();
-
- ?>
Maintenant passons à regarder ce même exemple, si __toString avait été défini à la place du "html_table ()" method.
<?php
$data_table = new csv_html('file.csv');
echo "<h2>Data Table</h2>$data_table";
?>
- <?php
-
- $data_table = new csv_html('file.csv');
- echo "<h2>Data Table</h2>$data_table";
-
- ?>
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
printf('<h2>Data Table</h2>%s', new csv_html('file.csv'));
?>
- <?php
-
- printf('<h2>Data Table</h2>%s', new csv_html('file.csv'));
-
- ?>
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
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)
);
}
}
?>
- <?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)
- );
- }
- }
-
- ?>
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.
Strong with this one, the sudo is.