Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблема с ob_start()


Автор: Shark 4.6.2011, 11:58
файл config.php
Код

<?php
class Option 
    {
        public $page_site = array
            (    'main' => 'Главная',
                'about_clan' => 'О клане',
                'about_user' => 'Об участниках',
                'statistica_user' => 'Статистика участников',
                'contakts' => 'Контакты'
            );
        public $content_menu = "";
    }

$Option = new Option();
?>


файл index.php
Код

<?php

define( '_INDEX', 1 );
include "config.php";


ob_start();
include_once ('template/menu.tpl.php');
$Option->content_menu = ob_get_contents();
ob_end_clean();
?>

файл menu.tpl.php (находится в папке tamplate)
Код

<?php
if (!defined('_INDEX'))die ();
?>
    <a href=><?php echo $Option->page_site['main']; ?></a>


почему выводится пустая страница?

если в файле index.php
заменить это
Код

ob_start();
include_once ('template/menu.tpl.php');
$Option->content_menu = ob_get_contents();
ob_end_clean();

на это
Код

include "template/menu.tpl.php";

все работает нормально

Автор: InfMag 5.6.2011, 16:09
Shark, если я не ошибаюсь кратко оглянув код, то проблема в
Код

ob_end_clean();
_clean заканчивает буфер и чистить его, а вывода дальше у вас никакого нет. Допишите после него:
Код

echo $Option->content_menu;

Автор: Shark 6.6.2011, 00:27
InfMag, помогло...
а можешь пояснить подробнее.. из-за чего это так? вроде же и без этого должно отображаться!?

Автор: InfMag 6.6.2011, 01:19
Shark, нет, не должно.
Ну на низком уровне мне сложно объяснить, я как на самом деле внутри реализовано не знаю, расскажу только как я себе представляю.

Я себе представляю происходящее так: при ob_start() дальнейший код как бы не в документе уже происходит, а в отдельном контейнере выполнения с контекстом, который был описан выше. Или вроде как компилируется, а потом исполняется позже при вызове компилированный код. Все echo и прочие выводы попадают в этот самый буфер, а не в документ. ob_get_contents() отдаёт контент, что произошёл в буфере, но его нужно получать до закрытия буфера.

ob_end_clean() просто закрывает буфер, очищая его, и контент если осталься, то только там, куда ты передавал результат ob_get_contents(), если передавал конечно.
ob_end_flush() закрывает буфер и сразу выводит его результат выполнения, после очищает.

В общем я бы сравнил с eval-ом) Как-то так по колхозному.

Добавлено @ 01:24
Ну ты можешь выполнить свободно любой код где понравится, а его вывод потом где угодно выставить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)