2011-03-02 12 views
12

Capisco come funziona, ma perché dovremmo praticamente usare questo?Dove e perché usiamo __toString() in PHP?

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

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

Non è questo lo stesso di questo:

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

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

non possiamo solo usare qualsiasi altro metodo pubblico per emettere qualsiasi testo? Perché abbiamo bisogno di un metodo magico come questo?

+0

s/casuale/arbitrario/ –

risposta

11

Non lo "serve". Ma la sua definizione consente all'oggetto di essere convertito implicitamente in stringa, il che è conveniente.

Avere funzioni membro che echo direttamente è considerato di scarsa qualità perché dà troppo controllo dell'output alla classe stessa. Si desidera restituire stringhe dalle funzioni membro e consentire al chiamante di decidere cosa fare con esse: se memorizzarle in una variabile, o echo, o qualsiasi altra cosa. L'uso della funzione magica significa che non è necessario chiamare la funzione esplicita per farlo.

+0

Come si richiama questo metodo per memorizzarli in una var. Se avessi una classe chiamata StringClass, potresti farlo in questo modo? '$ stringClass = new StringClass(); $ string = (stringa) $ stringClass'. Dato che l'assegnazione di '$ string = $ stringClass' assegnerebbe l'oggetto. – SamBremner

+0

@SamBremner: Sembra ragionevole come modo per attivare la conversione _esplicitamente_ (provalo e guarda cosa succede!). Ma il vero potere è nella conversione implicita, altrimenti potresti anche creare la tua funzione 'toString()', o una funzione simile con qualsiasi altro nome). –

-1

L'utilizzo di __toString() ha la priorità sull'operatore richiamato quando si stampano gli oggetti di quella classe, quindi è più semplice configurare come deve essere visualizzato un oggetto di tale classe.

+0

Non c'è alcun sovraccarico/override dell'operatore. Il metodo viene chiamato ogni volta che l'oggetto viene convertito in una stringa. – BoltClock

1

__toString consente di definire l'output quando l'oggetto viene convertito in una stringa. Ciò significa che è possibile print l'oggetto stesso anziché il valore restituito di una funzione. Questo è spesso più conveniente. Vedi the manual entry.

4

E 'solo un metodo standardizzato per produrre una rappresentazione di stringa di un oggetto. L'approccio random_method funziona se si presuppone che tutti gli oggetti del programma utilizzino lo stesso metodo, il che potrebbe non essere il caso se si utilizzano librerie di terze parti.

Non è necessario il metodo magico, ma offre praticità, in quanto non sarà mai necessario chiamarlo esplicitamente.

Inoltre, se il PHP deve internamente voler trasformare l'oggetto in testo, sa come farlo.

0

Non è necessario chiamare in modo specifico il metodo toString. Ogni volta che si stampa l'oggetto toString viene chiamato implicitamente. Qualsiasi altro metodo dovrebbe essere chiamato esplicitamente.

3

__toString() viene chiamato quando un oggetto viene passato a una funzione (esp echo() o print()) quando si prevede che il suo contesto sia una stringa. Poiché un oggetto non è una stringa, lo __toString() gestisce la trasformazione dell'oggetto in una rappresentazione di stringa.

7

In aggiunta a tutte le risposte esistenti, ecco un esempio,:

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(); 

Si tratta di una semplice classe che consente di gestire i Javascript. Dovresti registrare nuovi script chiamando lo $scripts->add('...').

Quindi per elaborare la coda e stampare tutti gli script registrati è sufficiente chiamare print $scripts;.

Ovviamente questa classe è inutile in questa forma, ma se si implementa la dipendenza delle risorse, il controllo delle versioni, si verifica la presenza di inclusioni duplicate ecc., Inizia ad avere senso (example).

L'idea di base è che lo scopo principale di questo oggetto è quello di creare una stringa (HTML), quindi l'uso di __toString in questo caso è conveniente ...

-2

è come sostituzione 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

Questa è una domanda php. Come ti aiuta? – Akintunde007