Где и почему мы используем __toString () в PHP? - PullRequest
21 голосов
/ 02 марта 2011

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

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

мы не можем просто использовать какой-либо другой публичный метод для вывода какого-либо текста? Зачем нам нужен такой магический метод?

Ответы [ 9 ]

15 голосов
/ 02 марта 2011

Вам это не «нужно».Но его определение позволяет неявно преобразовывать ваш объект в строку, что удобно.

Наличие функций-членов, которые echo напрямую, считается плохой формой, поскольку дает слишком большой контроль над выводом для самого класса.Вы хотите вернуть строки из функций-членов и позволить вызывающей стороне решить, что с ними делать: сохранять ли они в переменной, или echo выводить, или что-то еще.Использование магической функции означает, что вам не нужен явный вызов функции для этого.

12 голосов
/ 27 февраля 2012

В дополнение ко всем существующим ответам, вот пример:

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

Это простой класс, который помогает вам управлять JavaScript. Вы должны зарегистрировать новые сценарии, позвонив по номеру $scripts->add('...').

Затем, чтобы обработать очередь и распечатать все зарегистрированные сценарии, просто наберите print $scripts;.

Очевидно, что этот класс бессмыслен в этой форме, но если вы реализуете зависимость от активов, управление версиями, проверки на наличие дублирующихся включений и т. Д., Он начинает иметь смысл ( пример ).

Основная идея заключается в том, что основная цель этого объекта - создать строку (HTML), поэтому использование __toString в этом случае удобно ...

5 голосов
/ 02 марта 2011

Это просто стандартизированный метод для создания строкового представления объекта. Ваш подход random_method работает, если вы предполагаете, что все объекты в вашей программе используют один и тот же метод, что может быть не так, если вы используете сторонние библиотеки.

Вам не нужен магический метод, но он обеспечивает удобство, поскольку вам никогда не придется вызывать его явно.

Кроме того, если PHP внутренне захочет превратить ваш объект в текст, он знает, как это сделать.

4 голосов
/ 02 марта 2011

__toString() вызывается, когда объект передается функции (например, echo() или print()), когда его контекст должен быть строкой. Поскольку объект не является строкой, __toString() обрабатывает преобразование объекта в некоторое строковое представление.

3 голосов
/ 02 марта 2011

Метод __toString позволяет классу решать, как он будет реагировать, когда обрабатывается как строка

http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring

1 голос
/ 02 марта 2011

__toString позволяет вам определить вывод, когда ваш объект преобразуется в строку.Это означает, что вы можете print сам объект, а не возвращаемое значение функции.Это часто более удобно.См. ручной ввод .

0 голосов
/ 11 ноября 2016

это как переопределение с помощью 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;

}

}
0 голосов
/ 02 марта 2011

Вам не нужно специально вызывать метод toString.Когда бы вы ни печатали, объект toString вызывается неявно.Любой другой метод должен вызываться явно.

0 голосов
/ 02 марта 2011

Использование __toString() переопределяет оператор, который вызывается при печати объектов этого класса, поэтому вам легче настроить способ отображения объекта этого класса.

...