Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 06:05:06

Страниц: [1] 2
Печать
Автор Тема: Проблемка с __toString  (Прочитано 461 раз)
0 Пользователей и 1 Гость смотрят эту тему.
wats    ↓ 
28 Ноябрь, 2010, 03:37:42
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Привет! Вот для примера сильно упрощенный класс натив-шаблонизатора:
PHP
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.
Записан

обычный web-мастер
wats    ↓ 
28 Ноябрь, 2010, 04:02:38 , спустя 24 минуты 56 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

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

обычный web-мастер
phpdude    ↓ 
28 Ноябрь, 2010, 04:04:25 , спустя 1 минуту 47 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20790
Сила слова: 1.65

wats, да
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
wats    ↓ 
28 Ноябрь, 2010, 04:06:43 , спустя 2 минуты 18 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

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

обычный web-мастер
wats    ↓ 
28 Ноябрь, 2010, 04:23:09 , спустя 16 минут 26 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

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

обычный web-мастер
phpdude    ↓ 
28 Ноябрь, 2010, 04:25:36 , спустя 2 минуты 27 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.65

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
wats    ↓ 
28 Ноябрь, 2010, 04:31:24 , спустя 5 минут 48 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

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

обычный web-мастер
phpdude    ↓ 
28 Ноябрь, 2010, 04:36:22 , спустя 4 минуты 58 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.65

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
wats    ↓ 
28 Ноябрь, 2010, 04:42:25 , спустя 6 минут 3 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

а если я скажу, что в этом утверждении ТЫ НЕПРАВ? :)
возможно, но
без htmlspecialchars именно так и происходит и все работает нормально
Спустя 2 минуты 26 секунд добавил
забыл, в классе еще есть магические методы __set и __get для работы с массивом $this->_data
Записан

обычный web-мастер
phpdude    ↓ 
28 Ноябрь, 2010, 04:47:43 , спустя 5 минут 18 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20790
Сила слова: 1.65

без htmlspecialchars именно так и происходит и все работает нормально
'nj atqk
Спустя 4 секунды добавил
это фейл
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
wats    ↓ 
28 Ноябрь, 2010, 05:08:26 , спустя 20 минут 43 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

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

обычный web-мастер
WST    ↓ 
29 Июнь, 2011, 08:26:07 , спустя 213 дней 2 часа 17 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 6
Сила слова: 0

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

WBR, WST
Абырвалг    ↓ 
29 Июнь, 2011, 08:31:13 , спустя 5 минут 6 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

serialize/unserialize?
serializableInterface, __sleep/__wakeup?
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
WST    ↓ 
29 Июнь, 2011, 08:38:54 , спустя 7 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 6
Сила слова: 0

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

WBR, WST
fgets    ↓ 
29 Июнь, 2011, 08:44:03 , спустя 5 минут 9 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 1119
Сила слова: -0.09

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

эй детка не ссы в бассейн

Если в бочку с говном положить ложку меда — получится бочка говна. Если в бочку с медом положить ложку говна, не обольщайтесь ...
Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd