2011-03-02 31 views
12

Tôi hiểu cách nó hoạt động nhưng tại sao chúng ta thực tế sử dụng điều này?Ở đâu và tại sao chúng ta sử dụng __toString() trong PHP?

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

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

không Đây có phải là giống như này:

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

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

chúng ta không thể chỉ cần sử dụng bất kỳ phương pháp nào khác để đầu ra bất kỳ văn bản? Tại sao chúng ta cần phương pháp ma thuật như thế này?

+0

s/ngẫu nhiên/tùy ý/ –

Trả lời

11

Bạn không "cần" nó. Nhưng việc định nghĩa nó cho phép đối tượng của bạn được chuyển đổi hoàn toàn thành chuỗi, điều này thuận tiện.

Có các hàm thành viên echo trực tiếp được coi là biểu mẫu kém vì nó cho phép kiểm soát quá nhiều đầu ra cho chính lớp đó. Bạn muốn trả về các chuỗi từ các hàm thành viên và để người gọi quyết định phải làm gì với chúng: lưu trữ chúng trong một biến hoặc echo chúng ra hay bất kỳ thứ gì. Sử dụng chức năng ma thuật có nghĩa là bạn không cần cuộc gọi hàm rõ ràng để thực hiện việc này.

+0

Làm thế nào để bạn gọi phương thức này để lưu trữ chúng trong một var. Nếu bạn đã có một lớp học được gọi là StringClass bạn có thể làm điều đó như thế này? '$ stringClass = new StringClass(); $ string = (string) $ stringClass'. Khi chỉ định '$ string = $ stringClass' sẽ gán đối tượng. – SamBremner

+0

@SamBremner: Điều đó có vẻ hợp lý như một cách để kích hoạt chuyển đổi _explicitly_ (hãy thử và xem điều gì xảy ra!). Nhưng sức mạnh thực sự là trong chuyển đổi ngầm, nếu không bạn cũng có thể chỉ cần tạo hàm 'toString()' của riêng bạn, hoặc một hàm tương tự với bất kỳ tên nào khác). –

-1

Sử dụng __toString() ghi đè toán tử được gọi khi bạn in đối tượng của lớp đó, do đó, việc này giúp bạn dễ dàng định cấu hình cách hiển thị đối tượng của lớp đó hơn.

+0

Không có bất kỳ điều hành quá tải/ghi đè nào. Phương thức này được gọi bất cứ khi nào đối tượng được chuyển đổi thành một chuỗi. – BoltClock

1

__toString cho phép bạn xác định đầu ra khi đối tượng của bạn được chuyển đổi thành chuỗi. Điều này có nghĩa là bạn có thể tự mình print đối tượng, chứ không phải giá trị trả về của hàm. Điều này thường thuận tiện hơn. Xem the manual entry.

4

Nó chỉ là một phương pháp tiêu chuẩn hóa để tạo ra một chuỗi đại diện của một đối tượng. Phương pháp tiếp cận random_method của bạn hoạt động nếu bạn giả định tất cả các đối tượng trong chương trình của mình sử dụng cùng một phương thức, có thể không phải là trường hợp nếu bạn sử dụng thư viện của bên thứ ba.

Bạn không cần phương pháp ma thuật, nhưng nó cung cấp sự tiện lợi, vì bạn sẽ không bao giờ thực sự phải gọi nó một cách rõ ràng.

Ngoài ra, nếu PHP nên nội bộ bao giờ muốn biến đối tượng của bạn thành văn bản, nó biết cách thực hiện điều đó.

0

Bạn không phải gọi cụ thể phương thức toString. Khi bao giờ bạn in đối tượng toString đang được gọi ngầm. Bất kỳ phương pháp nào khác sẽ phải được gọi một cách rõ ràng.

3

__toString() được gọi khi đối tượng được chuyển đến hàm (esp echo() hoặc print()) khi ngữ cảnh của nó được mong đợi là một chuỗi. Vì một đối tượng không phải là một chuỗi, các __toString() xử lý việc chuyển đổi đối tượng thành một số biểu diễn chuỗi.

7

Ngoài tất cả các câu trả lời hiện tại, đây là một ví dụ,:

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

Đó là một lớp đơn giản giúp bạn quản lý Javascripts. Bạn sẽ đăng ký tập lệnh mới bằng cách gọi $scripts->add('...').

Sau đó, xử lý hàng đợi và in tất cả các tập lệnh đã đăng ký chỉ cần gọi print $scripts;.

Rõ ràng lớp này là vô nghĩa trong biểu mẫu này, nhưng nếu bạn triển khai phụ thuộc nội dung, phiên bản, kiểm tra vùi trùng lặp, v.v ..., bắt đầu có ý nghĩa (example).

Ý tưởng cơ bản là mục đích chính của đối tượng này là để tạo ra một chuỗi (HTML), do đó việc sử dụng các __toString trong trường hợp này là thuận tiện ...

-2

nó giống như ghi đè với 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

Đây là một câu hỏi php. Làm thế nào điều này giúp ?? – Akintunde007

Các vấn đề liên quan