2011-03-02 31 views
12

Entiendo cómo funciona, pero ¿por qué lo usamos prácticamente?¿Dónde y por qué usamos __toString() en PHP?

<?php 
    class cat { 
     public function __toString() { 
      return "This is a cat\n"; 
     } 
    } 

    $toby = new cat; 
    print $toby; 
?> 

¿No es esto lo mismo que esto:

<?php 
    class cat { 
     public function random_method() { 
      echo "This is a cat\n"; 
     } 
    } 

    $toby = new cat; 
    $toby->random_method(); 
?> 

No podemos utilizar cualquier otro método público a la salida de cualquier texto? ¿Por qué necesitamos un método mágico como este?

+0

s/random/arbitrary/ –

Respuesta

11

No lo "necesita". Pero definirlo permite que tu objeto se convierta implícitamente en cadena, lo cual es conveniente.

Tener funciones de miembro que echo directamente se considera una forma deficiente porque da demasiado control de la salida a la propia clase. Desea devolver cadenas de funciones de miembros y dejar que la persona que llama decida qué hacer con ellas: si desea almacenarlas en una variable o echo, o lo que sea. El uso de la función de magia significa que no necesita la llamada de función explícita para hacer esto.

+0

¿Cómo invocar este método para almacenarlos en una var. Si tuvieras una clase llamada StringClass, ¿podrías hacerlo así? '$ stringClass = new StringClass(); $ string = (cadena) $ stringClass'. Como asignar '' $ string = $ stringClass' asignaría el objeto. – SamBremner

+0

@SamBremner: Parece razonable como una forma de activar la conversión _explicitly_ (pruébalo y mira lo que sucede!). Pero la potencia real está en la conversión implícita; de lo contrario, también podría crear su propia función 'toString()', o una función similar con cualquier otro nombre). –

-1

El uso de __toString() anula el operador al que se llama cuando imprime objetos de esa clase, por lo que le facilita la configuración de cómo se debe mostrar un objeto de esa clase.

+0

No hay sobrecarga/anulación de operador. El método se llama siempre que el objeto se convierta en una cadena. – BoltClock

1

__toString le permite definir la salida cuando su objeto se convierte en una cadena. Esto significa que puede print el objeto en sí, en lugar del valor de retorno de una función. Esto es frecuentemente más conveniente. Ver the manual entry.

4

Es sólo un método estandarizado para producir una representación de cadena de un objeto. Su enfoque random_method funciona si supone que todos los objetos en su programa usan ese mismo método, lo que podría no ser el caso si usa bibliotecas de terceros.

No necesita el método mágico, pero ofrece comodidad, ya que nunca tendrá que llamarlo explícitamente.

Además, si PHP internamente desea convertir su objeto en texto, sabe cómo hacerlo.

0

No tiene que llamar específicamente al método toString. Cuando imprima el objeto, se llamará implícitamente a String. Cualquier otro método tendría que ser llamado explícitamente.

3

__toString() se llama cuando se pasa un objeto a una función (especialmente echo() o print()) cuando se espera que su contexto sea una cadena. Como un objeto no es una cadena, el __toString() maneja la transformación del objeto en una representación de cadena.

7

Además de todas las respuestas existentes, he aquí un ejemplo,:

class Assets{ 

    protected 
    $queue = array(); 

    public function add($script){ 
    $this->queue[] = $script; 
    } 

    public function __toString(){  
    $output = '';  
    foreach($this->queue as $script){ 
     $output .= '<script src="'.$script.'"></script>'; 
    }  
    return $output; 
    } 

} 


$scripts = new Assets(); 

Es una clase simple que le ayuda a administrar los javascript. Debería registrar nuevas secuencias de comandos llamando al $scripts->add('...').

Luego, para procesar la cola e imprimir todas las secuencias de comandos registradas simplemente llame al print $scripts;.

Obviamente esta clase no tiene sentido en esta forma, pero si implementa dependencia de activos, control de versiones, comprueba inclusiones duplicadas, etc., comienza a tener sentido (example).

La idea básica es que el propósito principal de este objeto es crear una cadena (HTML), por lo que el uso de __toString en este caso es conveniente ...

-2

es como anulación con C#:

class Person 

{ 

public Person(string firstName, string lastName) 

{ 

FirstName = firstName; 

LastName = lastName; 

} 

public string FirstName { get; set; } 

public string LastName { get; set; } 

public override string ToString() 

{ 

return FirstName + “ “ + LastName; 

} 

} 
+2

Esta es una pregunta php. ¿Cómo ayuda esto? – Akintunde007

Cuestiones relacionadas