Я понимаю, как это работает, но почему мы практически это используем?
<?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; } }