Где и почему мы используем __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();
?>
Нельзя ли использовать какой-либо другой публичный метод для вывода любого текста?
Почему нам нужен магический метод, подобный этому?
Ответы
Ответ 1
Вам это не нужно. Но его определение позволяет неявно преобразовывать объект в строку, что удобно.
Наличие функций-членов, которые echo
напрямую считаются плохими, потому что он дает слишком большой контроль над выходом для самого класса. Вы хотите вернуть строки из функций-членов, и пусть вызывающий абонент решает, что с ними делать: хранить их в переменной или echo
их или что-то еще. Использование магической функции означает, что вам не нужен явный вызов функции для этого.
Ответ 2
В дополнение ко всем существующим ответам, вот пример:
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 в этом случае удобно...
Ответ 3
Это просто стандартизованный метод для создания строкового представления объекта. Ваш подход random_method
работает, если вы предполагаете, что все объекты в вашей программе используют тот же метод, что может и не быть, если вы используете сторонние библиотеки.
Вам не нужен волшебный метод, но он обеспечивает удобство, так как вам никогда не придется называть его явно.
Кроме того, если PHP должен внутренне когда-либо хотеть превратить ваш объект в текст, он знает, как это сделать.
Ответ 4
Метод __toString позволяет классу решать, как он будет реагировать, когда он обрабатывается как строка
http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring
Ответ 5
__toString()
вызывается, когда объект передается функции (esp echo()
или print()
), когда предполагается, что его контекст будет строкой. Поскольку объект не является строкой, __toString()
обрабатывает преобразование объекта в некоторое строковое представление.
Ответ 6
__toString
позволяет вам определять вывод, когда ваш объект преобразуется в строку. Это означает, что вы можете print
сам объект, а не возвращаемое значение функции. Это часто более удобно. См. ввод вручную.
Ответ 7
Вам не нужно специально вызывать метод toString. Когда вы печатаете объект toString, вызывается неявным образом. Любой другой метод должен быть вызван явно.
Ответ 8
Использование __toString()
переопределяет оператор, который вызывается при печати объектов этого класса, поэтому упрощается настройка того, как должен отображаться объект этого класса.
Ответ 9
он вроде переопределяет С#:
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;
}
}