Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

обьект в строку?

23K
27 июля 2011 года
rafaelkyrdan
123 / / 03.05.2011
Можно ли в php обьект перевести в строку?
например в javascript'е есть метод Object.toString() который делает это, плюс его можно переопределить под себя.А в php где искать подобное ?
274
27 июля 2011 года
Lone Wolf
1.3K / / 26.11.2006
http://tinyurl.com/3vzgx4t
8
27 июля 2011 года
mfender
3.5K / / 15.06.2005
А что, print_r() не катит?
278
27 июля 2011 года
Alexander92
1.1K / / 04.08.2008
mfender, что вы имеете в виду? Насколько я знаю, нельзя управлять конкретным строковым представлением, которое будет сформировано с помощью print_r(), __toString() ведь гибче в этом плане.
8
27 июля 2011 года
mfender
3.5K / / 15.06.2005
Цитата: Alexander92
mfender, что вы имеете в виду? Насколько я знаю, нельзя управлять конкретным строковым представлением, которое будет сформировано с помощью print_r(), __toString() ведь гибче в этом плане.


А в чём вообще смысл этого всего преобразования? Что-то я не вкуриваю наверное.

278
27 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Код:
class Person {
   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, например.
8
27 июля 2011 года
mfender
3.5K / / 15.06.2005
Цитата: Alexander92

Смысл преобразования - в том, чтобы иметь возможность представлять объект в "читаемом" виде. Собственно, это то, ради чего служит ToString() в .NET, например.


так это не объекта представление, а только то, что напишешь в __toString. В моём понимании "объект в строку" - это как раз то, что можно увидеть в print_r() или var_dump() - поля объекта

271
27 июля 2011 года
MrXaK
721 / / 31.12.2002
Цитата: mfender
А в чём вообще смысл этого всего преобразования? Что-то я не вкуриваю наверное.


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

8
28 июля 2011 года
mfender
3.5K / / 15.06.2005
нет, ну я понял, что если есть метод __toString(), то он вызывается неявно при попытке вывести в поток объект. Вот только счастья в этом я не вижу )))) И мне кажется, что автор не про это спрашивал. Хотя, чёрт его знает, может и про это… )))
271
28 июля 2011 года
MrXaK
721 / / 31.12.2002
Ну счастье в том, что не только при выводе в поток))) просто когда нужно обратится как к тексту) в пыхе нет, но в других языках я, например, очень часто юзаю что-то типа sprintf('%s', $c), с учётом что эти магические методы определяю всегда заранее)) да и вывод, если что, удобнее в самом классе менять, нежели лазить и искать все вхождения, где этот класс создаётся
а автор-то как раз про это и спрашивал, с учётом упоминания им Object.toString из JS
278
28 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: mfender
В моём понимании "объект в строку" - это как раз то, что можно увидеть в print_r() или var_dump() - поля объекта


Ну тогда можно уже и про сериализацию поговорить, тоже по-своему реализует "объект в строку". :)

274
28 июля 2011 года
Lone Wolf
1.3K / / 26.11.2006
mfender напиши обьект, методы котрого возвращают сам обьект, и попытайся сделать вар_дамп.. будет веселе =)

а __toString можно для удобства использывать.
Например с тем же классом юзер. да можно описать метод который будет делать
 
Код:
function getUserInfo() {
   return $this->firstname." ".$this->lastname." (".$this->age.")";
}

и далее
 
Код:
echo "User info: ".$user->getUserinfo();


В случае __toString
 
Код:
echo "User info: $user";


очень удобно.
8
28 июля 2011 года
mfender
3.5K / / 15.06.2005
Цитата: Lone Wolf

очень удобно.


Вот если честно, удобства вообще не вижу, а только лишнюю писанину )))) Представляете MVC с шаблонизатором Smarty. В объект шаблонизатора передаётся ссылка на тот же объект $user и уже в шаблонизаторе используются public методы $user'а. Причём так как это описано в самом $user, а не так как предусмотрено единственным возможным методом $user::__toString()

Ну и нахрена мне такие вот сомнительные удобства в виде magic methods? )))

278
28 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Вообще, как по мне, удобнее было бы (если уж так не терпится) просто определить пользовательский метод toString(), а не пользоваться magic methods. Ибо с __toString() могут быть связаны хотя бы ошибки неявного приведения объекта к строке. Так что, в общем-то, соглашусь, что само по себе удобство __toString() сомнительное.
12
30 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: mfender
Вот если честно, удобства вообще не вижу, а только лишнюю писанину )))) Представляете MVC с шаблонизатором Smarty. В объект шаблонизатора передаётся ссылка на тот же объект $user и уже в шаблонизаторе используются public методы $user'а. Причём так как это описано в самом $user, а не так как предусмотрено единственным возможным методом $user::__toString()

Ну и нахрена мне такие вот сомнительные удобства в виде magic methods? )))


А метод вообще то нужен не для юзанию в шаблонизаторах. Реально он вообще нужен только при отладке (или в некоторых специфических случаях) когда с объектом может потребоваться работа в строковом контексте. Когда ты можешь сделать echo объекта и он тебе напишет о себе что-то членораздельное, а не "я объект №хер-знает-сколько". К примеру при записи в лог. При этом ты сам при реализации метода и определишь, что же туда будет писаться.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог