Здравствуйте! Пример: <?php $content = require_once("content.php"); echo "Hello"; ?> Почему переменная выводится на экран, я ведь ей лишь присвоил значение (require_once("content.php"))? Начал изучать php, с создания небольшой CMS. В теле файла index.php выводится переменная $content. Значение этой переменной изменяется в контроллере (controller.php) после нажатия кнопки меню (на require_once("content.php") require_once("content1.php") require_once("content2.php") ). Как можно присвоить переменной значение типа require_once но без его вывода на экран?
Интереснее все таки свою создать) Да и после того как начал создавать CMS, все больше и больше начинаю понимать как устроены CMS-ки и фреймворки.
Скоро ты разочаруешься ((( Лично я вообще не понял что ты там делаешь. Раз заговорил о контроллере занчить должен быть у тебя и представление (view). Контроллер изменяет переменную инклудит view и там просто выводится переменная через echo или <?=$data?> Это простой вариант. Что ты там делаешь... по вопросу ты вообще не понимаешь что делает require_once.
require_once подключает файл, при этом при успешном подключении метод возвращает true, а в не успешном (например файла нет) false, по этому в переменной $content находится true или false, а не что ты там вообразил.
Представление есть. Главная страничка index.php, она через контроллер отображает верхнюю часть (шапку) сайта через index.php (который лежит в папке templates/defaults/views), и в зависимости от нажатой кнопки меню должен был отобразить вторую, основную часть сайта (это content.php, content1.php и т.д.). В представлении index.php есть меню, которое должно вывести переменную $content. А эта переменная объявлена в контроллере, значением которого являются представления content.php, content1.php, ... Добавлено спустя 2 минуты 51 секунду: Читал как то, немного усложненной версией решения проблемы показалось) Добавлено спустя 3 минуты 36 секунд: Я так понял это нормальное явление для данного присвоения (присвоение require переменной). Буду продумывать другую логику. Всем спасибо!
Ну вот, обычный html. Если делаешь Код (PHP): $content = require_once("content.php"); то этот html сразу выводится, а в переменной $content будет лишь значение true
А что изменится если будет не просто html? Я так понял в любом случае будет либо true либо false при таком присвоении. Неправильная логика, буду менять)
Если бы в content.php было что-то такое Код (PHP): $content = '<h1>Главная страница</h1>'; или Код (PHP): $content = <<<CONTENT <h1>Главная страница</h1> CONTENT; , а подключение такое Код (PHP): $content = ''; require_once("content.php"); , то можно было бы рассчитывать, что в переменной $content окажется <h1>Главная страница</h1>
Код (PHP): ob_start(); require_once'content.php'; $content=ob_get_contents(); ob_end_flush(); echo $content; Либо делать переменную в файле который подключаем, как сказал YSandro.
либо в content.php в начале Код (Text): ob_start(); в конце Код (Text): return ob_get_clean(); тогда можно делать Код (Text): $content = require_once("content.php");
Нет. Не логику продумать, а архитектуру через мясорубку прогнать в угоду правилу "сначала заголовки, потом контент!!!". Или изобрести колесо. Я как-то видел гениальное решение. В коде были функции что-то типа send_header(); и send_content(); Одна писала в некий глобальный массив все хедеры, другая - все, что нужно отдать клиенту. В шатдаун-функции массивы опорожнялись, сначала заголовочный, потом с контентом. И примерно так звучало: "Вот вам изящное решение, позволяющее не использовать буферизацию!". Ироничность ситуации была выше 146%.
Примерно так работает объект Response в Symfony. УГ превращается в богоугодное дело, если этим занимается Фабьен.
Настоящий хардкор - это поставить в php.ini Код (Text): output_buffering = On или в .htaccess Код (Text): php_flag output_buffering on и тогда никакие функции не нужны
Не всякий хостер такое позволит, если речь идет о широко распространенном продукте, надо быть готовым, что его могут накатывать и на бесплатные говнохостинги. Нужны. Кроме обстарта и обэндфлуша там есть еще другие ob_ функции. А еще руками с помощью этих функций можно делать вложенные буферы, что, порой, удобно. Вместо конфигов просто надо поставить в стартовой точке скрипта ob_start и зарегать шатдаун функцию, в которой будет ob_end_flush. Либо просто сам ob_end_flush зарегать как шатдаун функцию, если по завершению работы скрипта не предвидится других действий.