Где и почему мы используем __toString () в PHP?

Я понимаю, как это работает, но почему мы практически это используем?

<?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; } }