Подтвердить что ты не робот

Где и почему мы используем __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();
?>

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

4b9b3361

Ответ 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 должен внутренне когда-либо хотеть превратить ваш объект в текст, он знает, как это сделать.

Ответ 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;

}

}