Я понимаю, как это работает, но почему мы практически это используем?
<?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(); ?> 
нельзя ли использовать какой-либо другой публичный метод для вывода любого текста? Зачем нам нужен такой магический метод?
Вам это не нужно. Но его определение позволяет неявно преобразовывать объект в строку, что удобно.
  Наличие функций-членов, которые echo напрямую считается плохой формой, потому что оно дает слишком большой контроль над выходом для самого класса.  Вы хотите вернуть строки из функций-членов, и позвольте собеседнику решить, что с ними делать: хранить ли их в переменной или echo сигналы или что-то еще.  Использование магической функции означает, что вам не нужен явный вызов функции для этого. 
В дополнение ко всем существующим ответам, вот пример:
 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(); 
  Это простой класс, который помогает вам управлять javascripts.  Вы должны регистрировать новые скрипты, вызывая $scripts->add('...') . 
  Затем, чтобы обработать очередь и распечатать все зарегистрированные скрипты, просто вызовите print $scripts;  , 
Очевидно, что этот класс бессмыслен в этой форме, но если вы реализуете зависимость активов, управление версиями, проверяет дубликаты включений и т. Д., Это начинает иметь смысл ( пример ).
Основная идея заключается в том, что основной целью этого объекта является создание строки (HTML), поэтому использование __toString в этом случае удобно …
  Это всего лишь стандартизованный метод для создания строкового представления объекта.  Ваш random_method работает, если вы предполагаете, что все объекты в вашей программе используют тот же метод, что может и не быть, если вы используете сторонние библиотеки. 
Вам не нужен волшебный метод, но он обеспечивает удобство, так как вам никогда не придется называть его явно.
Кроме того, если PHP должен внутренне когда-либо хотеть превратить ваш объект в текст, он знает, как это сделать.
Метод __toString позволяет классу решать, как он будет реагировать, когда он обрабатывается как строка
http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring
  __toString() вызывается, когда объект передается функции (esp echo() или print() ), когда ожидается, что его контекст будет строкой.  Поскольку объект не является строкой, __toString() обрабатывает преобразование объекта в некоторое строковое представление. 
  __toString позволяет вам определять вывод, когда ваш объект преобразуется в строку.  Это означает, что вы можете print сам объект, а не возвращаемое значение функции.  Это часто более удобно.  См. Руководство пользователя . 
Вам не нужно специально вызывать метод toString. Когда вы печатаете объект toString, вызывается неявным образом. Любой другой метод должен быть вызван явно.
  Использование __toString() переопределяет оператор, который вызывается при печати объектов этого класса, поэтому упрощается настройка того, как должен отображаться объект этого класса. 
это похоже на переопределение с помощью 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; } }