За последние 24 часа нас посетили 15554 программиста и 1600 роботов. Сейчас ищут 893 программиста ...

require_once в переменной

Тема в разделе "PHP для новичков", создана пользователем Makk, 23 мар 2014.

  1. Makk

    Makk Новичок

    С нами с:
    23 мар 2014
    Сообщения:
    17
    Симпатии:
    0
    Здравствуйте!

    Пример:
    <?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 но без его вывода на экран?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Бери фреимворк так проще.
     
  3. Makk

    Makk Новичок

    С нами с:
    23 мар 2014
    Сообщения:
    17
    Симпатии:
    0
    Интереснее все таки свою создать) Да и после того как начал создавать CMS, все больше и больше начинаю понимать как устроены CMS-ки и фреймворки.
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Скоро ты разочаруешься (((

    Лично я вообще не понял что ты там делаешь. Раз заговорил о контроллере занчить должен быть у тебя и представление (view). Контроллер изменяет переменную инклудит view и там просто выводится переменная через echo или <?=$data?>
    Это простой вариант. Что ты там делаешь... по вопросу ты вообще не понимаешь что делает require_once.
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    require_once подключает файл, при этом при успешном подключении метод возвращает true, а в не успешном (например файла нет) false, по этому в переменной $content находится true или false, а не что ты там вообразил.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    тебе нужна буферизация вывода. читай про функции, начинающиеся с ob_*
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    По моему можно и без буферизации спокойно обойтись. Надо логику правильно продумать.
     
  8. Makk

    Makk Новичок

    С нами с:
    23 мар 2014
    Сообщения:
    17
    Симпатии:
    0
    Представление есть.
    Главная страничка index.php, она через контроллер отображает верхнюю часть (шапку) сайта через index.php (который лежит в папке templates/defaults/views), и в зависимости от нажатой кнопки меню должен был отобразить вторую, основную часть сайта (это content.php, content1.php и т.д.). В представлении index.php есть меню, которое должно вывести переменную $content. А эта переменная объявлена в контроллере, значением которого являются представления content.php, content1.php, ...

    Добавлено спустя 2 минуты 51 секунду:
    Читал как то, немного усложненной версией решения проблемы показалось)

    Добавлено спустя 3 минуты 36 секунд:
    Я так понял это нормальное явление для данного присвоения (присвоение require переменной). Буду продумывать другую логику.

    Всем спасибо!
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Нету!
    Вот покажи примерное содержимое файла content.php
     
  10. Makk

    Makk Новичок

    С нами с:
    23 мар 2014
    Сообщения:
    17
    Симпатии:
    0
    <h1>Главная страница</h1>

    ))
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ну вот, обычный html.
    Если делаешь
    Код (PHP):
    1. $content = require_once("content.php"); 
    то этот html сразу выводится, а в переменной $content будет лишь значение true
     
  12. Makk

    Makk Новичок

    С нами с:
    23 мар 2014
    Сообщения:
    17
    Симпатии:
    0
    А что изменится если будет не просто html? Я так понял в любом случае будет либо true либо false при таком присвоении.
    Неправильная логика, буду менять)
     
  13. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если бы в content.php было что-то такое
    Код (PHP):
    1. $content = '<h1>Главная страница</h1>'; 
    или
    Код (PHP):
    1. $content = <<<CONTENT
    2. <h1>Главная страница</h1>
    3. CONTENT;
    , а подключение такое
    Код (PHP):
    1. $content = '';
    2. require_once("content.php"); 
    , то можно было бы рассчитывать, что в переменной $content окажется <h1>Главная страница</h1>
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. require_once'content.php';
    2. $content=ob_get_contents();
    3. echo $content; 
    Либо делать переменную в файле который подключаем, как сказал YSandro.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    либо в content.php в начале
    Код (Text):
    1. ob_start();
    в конце
    Код (Text):
    1. return ob_get_clean();
    тогда можно делать
    Код (Text):
    1. $content = require_once("content.php");
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет. Не логику продумать, а архитектуру через мясорубку прогнать в угоду правилу "сначала заголовки, потом контент!!!". Или изобрести колесо.

    Я как-то видел гениальное решение. В коде были функции что-то типа send_header(); и send_content(); Одна писала в некий глобальный массив все хедеры, другая - все, что нужно отдать клиенту. В шатдаун-функции массивы опорожнялись, сначала заголовочный, потом с контентом. И примерно так звучало: "Вот вам изящное решение, позволяющее не использовать буферизацию!".

    Ироничность ситуации была выше 146%.
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Примерно так работает объект Response в Symfony. УГ превращается в богоугодное дело, если этим занимается Фабьен.
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Но зачем, когда есть ob_? Или я что-то не правильно понял?
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Настоящий хардкор - это поставить в php.ini
    Код (Text):
    1. output_buffering = On
    или в .htaccess
    Код (Text):
    1. php_flag output_buffering on
    и тогда никакие функции не нужны
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Fell-x27, да я и сам не понимаю.
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не всякий хостер такое позволит, если речь идет о широко распространенном продукте, надо быть готовым, что его могут накатывать и на бесплатные говнохостинги.

    Нужны. Кроме обстарта и обэндфлуша там есть еще другие ob_ функции. А еще руками с помощью этих функций можно делать вложенные буферы, что, порой, удобно.

    Вместо конфигов просто надо поставить в стартовой точке скрипта ob_start и зарегать шатдаун функцию, в которой будет ob_end_flush. Либо просто сам ob_end_flush зарегать как шатдаун функцию, если по завершению работы скрипта не предвидится других действий.