2011-03-02 103 views
12

我明白它是如何工作的,但我們爲什麼要實際使用它?我們在哪裏以及爲什麼在PHP中使用__toString()?

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

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

這難道不是與此相同:

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

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

我們不能只用任何其他公共方法輸出任何文本? 爲什麼我們需要像這樣的魔法?

+0

s/random /任意/ –

回答

11

你不需要「它」。但是定義它可以讓你的對象被隱式轉換爲字符串,這很方便。

具有成員函數echo直接被認爲是不好的形式,因爲它給輸出類本身提供了太多的控制。你想從成員函數中返回字符串,並讓調用者決定如何處理它們:是將它們存儲在一個變量中,還是將它們存儲起來,或者其他什麼。使用魔術功能意味着你不需要顯式的函數調用來做到這一點。

+0

你如何調用這個方法將它們存儲在var中。如果你有一個名爲StringClass的類,你可以這樣做嗎? '$ stringClass = new StringClass(); $ string =(string)$ stringClass'。因爲只是分配'$ string = $ stringClass'會分配對象。 – SamBremner

+0

@SamBremner:這看起來合理,可以作爲觸發轉換的方式_explicitly_(嘗試一下,看看會發生什麼!)。但真正的權力是在隱式轉換中,否則你可能只需創建自己的'toString()'函數或者具有任何其他名稱的類似函數)。 –

-1

使用__toString()將覆蓋打印該類的對象時調用的操作符,因此可以更輕鬆地配置應該如何顯示該類的對象。

+0

沒有任何操作符重載/覆蓋。只要對象轉換爲字符串,就會調用該方法。 – BoltClock

1

__toString允許您在對象轉換爲字符串時定義輸出。這意味着你可以print這個對象本身,而不是一個函數的返回值。這通常更方便。見the manual entry

4

這只是以產生一個對象的字符串表示一個標準化的方法處理它會如何反應。如果您假設程序中的所有對象都使用相同的方法,那麼您的random_method方法可以工作,但如果您使用第三方庫,則可能不是這種情況。

你不需要神奇的方法,但它提供了方便,因爲你永遠不需要明確地調用它。另外,如果PHP內部曾經想將你的對象變成文本,它就知道如何做到這一點。

0

您不必專門調用toString方法。當你打印對象toString被隱式調用時。任何其他方法都必須明確調用。

3

__toString()當對象被傳遞給一個函數時(尤其是echo()print()),當它的上下文期望是一個字符串時,會調用__toString()。由於對象不是字符串,因此__toString()會將對象轉換爲某種字符串表示形式。

7

除了現有的所有答案,這裏是一個例子,:

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

這是一個簡單的類,它可以幫助您管理的JavaScript。您可以致電$scripts->add('...')註冊新腳本。

然後處理隊列並打印所有註冊的腳本,只需撥打print $scripts;即可。

很顯然,這個類在這種形式中是毫無意義的,但是如果你實現資產依賴,版本控制,檢查重複包含等,它開始變得有意義(example)。

的基本思路是,此對象的主要目的是爲了創建一個字符串(HTML),所以在這種情況下,使用__toString的便利...

-2

這就像用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

這是一個php問題。這有什麼幫助? – Akintunde007

相關問題