TUTORIAL: La magia de __toString ()

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Marzo 12th, 2009, 7:57 pm

Introducción


Youve oído hablar de " Métodos mágicos "Si hay algo que hacer en absoluto con el youve [sigla = Programación Orientada a Objetos: 3uv30xo7] Programación Orientada a Objetos [/acronym] en [sigla = Hypertext PreProcessor: 3uv30xo7] PHP [/acronym] . Lo más probable es la __construct (), que se invoca cuando se inicializa una instancia de una clase youve definido.

Mientras __construct () es un método mágico no oficial que se requiere para definir al escribir clases, __toString () es opcional en todos los sentidos de la palabra y es a menudo pasado por alto en favor de los métodos de escritura diseñado para ser invocado por la única razón de devolver un cadena legible por humanos.

No hay nada de malo hacerlo, pero si usted puede conseguir los objetos para devolver una cadena humana de lectura sin necesidad de escribir algo más que la suma de "objeto" de referencia en lugar de "$ objeto-> metodo ()", ¿por qué no hacer que haga que?

Los conceptos de este tutorial se aplican a [sigla = Hypertext PreProcessor: 3uv30xo7] PHP [/acronym] la versión 5.2 o posterior. Debido a las limitaciones en el contexto que: 3uv30xo7 [sigla = Hypertext PreProcessor] PHP [/acronym] invoca el método mágico __toString antes de [sigla = Hypertext PreProcessor: 3uv30xo7] PHP [/acronym] 5.2, los ejemplos contenidos en este tutorial no pueden trabajar en las versiones anteriores.

Ejemplos de uso de


Permite comparar un ejemplo utilizando tanto la práctica común, y el uso de __toString.

Primero un ejemplo usando una práctica común para cargar un archivo CSV e imprimirlo como una = [sigla Hyper Text Markup Language: 3uv30xo7] HTML [/acronym] <table>.
PHP Código: [ 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. ?>


Ahora veamos el mismo ejemplo, si __toString se había definido en lugar de la "html_table ()" método.
PHP Código: [ 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 ejemplo más útil de instancias puede ser anónima, donde se conserva ninguna referencia al objeto. Esto es útil cuando un objeto es un formateador simple y probablemente nunca se puede manipular después de instancias.
PHP Código: [ 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. ?>


Así que ¿Cómo puedo __toString Implementar y #40; y #41;?


Exactamente de la misma manera a definir su __construct () el método, y cualquiera de los otros métodos de la magia, con la excepción de __autoload ().
Como público método dentro de su definición de clase.

Aquí está un ejemplo, aunque sea crudo, de cómo la clase en el ejemplo CSV puede ser escrito.
PHP Código: [ 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. ?>


Ahora usted puede preguntar, " ¿Por qué no tienen el constructor de devolver el = [sigla Hyper Text Markup Language: 3uv30xo7] HTML [/acronym] ? ".
Porque haría lo que se convertirá en su pare constructor de la clase no sirve de nada si alguna vez trató de extender la clase, por eso.

Conclusión


Dar __toString () un intento, apenas puede ser como él.
Moderator Remark: Noted __autoload exception
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Marzo 12th, 2009, 7:57 pm

  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Junio 30th, 2009, 7:00 pm

Ah sí son constructores y público en general como el mal si la clase tiene propiedades que deben ser establecidas, de ahí la Factroy Patrones :)

En cuanto a la toString (), me acuerdo, probablemente el más bajo evaluado, en virtud del método usado en el planeta.

Encontrar utilizando (a menos que las necesidades exijan otra cosa), proporciona un método ordenado para generar identificadores legible para dicho objeto.

La otra ventaja es que cosas como C #y Java invocar automáticamente cuando se opone a obligar a la interfaz de usuario objetos para el IEU propiedad Text.

Es bueno ver que apoya PHP y :)
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Junio 30th, 2009, 11:49 pm

Creo PHP lanzar un error fatal si los constructores se definen como algo que no sea público.

Im no un gran fan de muchos de los patrones de diseño en uso hoy en día, me cringe cualquier momento que leí la palabra "fábrica". La mayoría de los que parece que sólo complica más las cosas para mí. :)
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Julio 1st, 2009, 1:48 am

Soy un gran fan de los patrones :) Especialmente con runtimes como Java y. NET. Singletons y todos tht jazz
Watch me grow

Publicar Información

  • Total de mensajes en este tema: 4 mensajes
  • Moderador: Tutorial Writers
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC