ФорумПрограммированиеPHP для идиотовPHP и ООП → Проблемка с __toString

Проблемка с __toString

  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 4:37

    Привет! Вот для примера сильно упрощенный класс натив-шаблонизатора:
    class Template {

    protected $_template;
    protected $_data = array();

    public function __construct($template, array $data = NULL)
    {
    $this->_template = $template;

    if ($data !== NULL)
    $this->_data = $data;
    }

    public function __toString()
    {
    return (string)$this->render();
    }

    public function render()
    {
    extract($this->_data);
    require $this->_template;
    }
    }

    Проблема в том что если в $data передан другой объект этого же класса с другим шаблоном (то есть в главный шаблон сайта я вставляю с помощью переменной блок с другим шаблоном) и при этом к массиву $this->_data я применю функцию htmlspecialchars то в браузер выводится сначала шаблон из блока, а ниже уже главный шаблон. Если уберу htmlspecialchars то все работает как надо. Я как понял что это происходит из за магической функции __toString, она когда объект преобразует в строку почему то автоматом выводит шаблон в браузер, но это происходит только когда к массиву $this->_data применяется функция htmlspecialchars.
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 5:02, спустя 24 минуты 56 секунд

    Прошу прощения, помойму виновата функция htmlspecialchars
    $news = new Template('templates/news.php', array('title' => 'Новости'));
    htmlspecialchars($news, ENT_QUOTES, 'UTF-8');

    выведет в браузер уже обработанный шаблон!?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 ноября 2010 г. 5:04, спустя 1 минуту 47 секунд

    wats, да
    Сапожник без сапог
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 5:06, спустя 2 минуты 18 секунд

    phpdude, точнее она вывела шаблон в браузер с уже подставленными значениями, но своего прямого назначения не выполнила
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 5:23, спустя 16 минут 26 секунд

    Хм, как с этим бороться? Если попался объект, то что с ним делать? Просто пропускать нельзя.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 ноября 2010 г. 5:25, спустя 2 минуты 27 секунд

    ytn, это не выводит, просто когда ты делаешь requre от шаблона - он уходит в вывод, как будто это echo, это надо понимать.
    Сапожник без сапог
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 5:31, спустя 5 минут 48 секунд

    Я так и понял, но почему шаблон уходит в вывод?, если он должен в переменную записаться, ведь без htmlspecialchars именно так и происходит и все работает нормально.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 ноября 2010 г. 5:36, спустя 4 минуты 58 секунд

    если он должен в переменную записаться,

    а если я скажу, что в этом утверждении ТЫ НЕПРАВ? :)
    Сапожник без сапог
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 5:42, спустя 6 минут 3 секунды

    а если я скажу, что в этом утверждении ТЫ НЕПРАВ? :)

    возможно, но
    без htmlspecialchars именно так и происходит и все работает нормально

    Спустя 146 сек.
    забыл, в классе еще есть магические методы __set и __get для работы с массивом $this->_data
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 ноября 2010 г. 5:47, спустя 5 минут 18 секунд

    без htmlspecialchars именно так и происходит и все работает нормально

    'nj atqk
    Спустя 4 сек.
    это фейл
    Сапожник без сапог
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz 28 ноября 2010 г. 6:08, спустя 20 минут 43 секунды

    phpdude, спасибо, кажется разобрался
  • WST

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 29 июня 2011 г. 9:26, спустя 213 дней 2 часа 17 минут

    Мне иногда очень не хватает функции типа __fromString(). Для неявного создания объектов из строк. К примеру, если некоторый метод объявлен как
    public function foo(Bar $bar) {
    // …
    }

    Было бы очень классно иметь возможность совершить вызов типа foo('Hello, world!') и получить в теле метода свежесозданный объект класса Bar…
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 29 июня 2011 г. 9:31, спустя 5 минут 6 секунд

    serialize/unserialize?
    serializableInterface, __sleep/__wakeup?
  • WST

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 29 июня 2011 г. 9:38, спустя 7 минут 41 секунду

    Не. Представьте, что конструктор объекта принимает на вход строку. К примеру, сам класс представляет собой класс «строка», а в методах, оперирующих со строками, хотелось бы сразу получать строки в виде объектов. В C++ с этим проблем не возникает, но в PHP не знаю как сделать, и можно ли.
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 29 июня 2011 г. 9:44, спустя 5 минут 9 секунд

    выдуманные пхп проблемы, зачем нужна строгая типизация языку с динамической типизацией? навыдумывают себе проблем

Пожалуйста, авторизуйтесь, чтобы написать комментарий!