обьект в строку?
например в javascript'е есть метод Object.toString() который делает это, плюс его можно переопределить под себя.А в php где искать подобное ?
А в чём вообще смысл этого всего преобразования? Что-то я не вкуриваю наверное.
public $first_name;
public $last_name;
public function __construct($first_name, $last_name) {
$this->first_name = $first_name;
$this->last_name = $last_name;
}
public function __toString() {
return $this->first_name.' '.$this->last_name;
}
};
$vasya = new Person('Вася', 'Пупкин');
echo $vasya; // выведет 'Вася Пупкин'
print_r($vasya); // выведет трудночитаемую служебную информацию
Смысл преобразования - в том, чтобы иметь возможность представлять объект в "читаемом" виде. Собственно, это то, ради чего служит ToString() в .NET, например.
Смысл преобразования - в том, чтобы иметь возможность представлять объект в "читаемом" виде. Собственно, это то, ради чего служит ToString() в .NET, например.
так это не объекта представление, а только то, что напишешь в __toString. В моём понимании "объект в строку" - это как раз то, что можно увидеть в print_r() или var_dump() - поля объекта
__toString() преобразует класс в строковое представление.. вызывается всегда, когда компилятор требует явного преобразования типов в строку, причём у возврата __toString должен быть строковой тип, иначе будет кинуто E_RECOVERABLE_ERROR.. причём функция будет вызвана не только в случае echo $c; print $c; где $c - класс, но и (с 5.2.0) в случае printf('%s', $c) и даже при попытке передать класс как параметр в функции типа substr() и т. п.
объект в строку - это как раз то, что должно вызваться при попытке напечатать объект)) print_r, var_dump и т. п. - внутренние функции разработчика, грубо говоря.. согласитесь, конечному юзеру их показывать как-то неэстетично...
а вот echo $c; может пригодится много где) да хотя бы для вывода на экран какого-нибудь сборщика XML
да и многие классы PHP нативно имеют этот метод... те же встроенные исключения, например) собственно поэтому можно писать echo $e; а не echo $e->getMessage()
а автор-то как раз про это и спрашивал, с учётом упоминания им Object.toString из JS
Ну тогда можно уже и про сериализацию поговорить, тоже по-своему реализует "объект в строку". :)
а __toString можно для удобства использывать.
Например с тем же классом юзер. да можно описать метод который будет делать
return $this->firstname." ".$this->lastname." (".$this->age.")";
}
и далее
В случае __toString
очень удобно.
очень удобно.
Вот если честно, удобства вообще не вижу, а только лишнюю писанину )))) Представляете MVC с шаблонизатором Smarty. В объект шаблонизатора передаётся ссылка на тот же объект $user и уже в шаблонизаторе используются public методы $user'а. Причём так как это описано в самом $user, а не так как предусмотрено единственным возможным методом $user::__toString()
Ну и нахрена мне такие вот сомнительные удобства в виде magic methods? )))
Ну и нахрена мне такие вот сомнительные удобства в виде magic methods? )))
А метод вообще то нужен не для юзанию в шаблонизаторах. Реально он вообще нужен только при отладке (или в некоторых специфических случаях) когда с объектом может потребоваться работа в строковом контексте. Когда ты можешь сделать echo объекта и он тебе напишет о себе что-то членораздельное, а не "я объект №хер-знает-сколько". К примеру при записи в лог. При этом ты сам при реализации метода и определишь, что же туда будет писаться.