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


Автор: Ant0ha 7.2.2010, 20:45
Как мажно подключить в скрипт строку,  а не файл? 
То есть вместо include 'test.php'; 
Прописать что-то вроде
include_string "<?php echo 'тест'; ?>"; 

Автор: Ant0ha 7.2.2010, 21:07
Варианты с "переподвыподвертыванием" тоже подойдут =)

Автор: awers 7.2.2010, 21:47
eval('...');

Добавлено через 9 минут и 13 секунд
Помогло?

Автор: Ant0ha 7.2.2010, 21:57
То что нужно, спасибо.

Автор: nerezus 7.2.2010, 23:00
99,9%, что твоя задача неверно поставлена.
И ты решаешь не то, что тебе нужно.

Автор: Ant0ha 12.2.2010, 10:54
Задача поставлена как нужно, сейчас проверил с eval() - не то... Мне нужно весь сценарий из файла прочитать в строку, внести изменения "на лету" и выполнить изменнный код из строки. Такое вообще возможно?

Автор: Ипатьев 12.2.2010, 11:07
А можно поинтересоватьс, по каким критериям определяется, что "Задача поставлена как нужно"? Богатый опыт? Большая теоретическая подготовка? 

Автор: Ant0ha 12.2.2010, 11:12
А можно мы будем общаться по теме?

Автор: Ипатьев 12.2.2010, 11:17
Можно.
Когда мы увидим в теме смысл.
Пока мы видим вопрос мальчика из песочницы, который нашел крысиный яд, и хочет сделать из него пирожки.
При этом мальчик мнит себя директором ресторана. 
Когда взрослые люди говорят ему бросить бяку, он просит общаться по теме.

Для общения по теме дяденька рекомендует описать исходную задачу, для которой понадобилось столь замысловатое решение, а потом выслушать очевидный простой ответ, который применяется повсеместно, и прошел мимо мальчика только в силу его очень низкого кругозора

Автор: Sentox 12.2.2010, 11:32
Сохранить изменённую строку в temp_file.php и подключить его.

Автор: Ant0ha 12.2.2010, 11:33
Ну, хорошо, "дяденька". Есть простой шаблонизатор, суть его заключается в замене "<?php echo " на "[*="; "<?php" на "[*"; "?>" на "*]"
То есть, чтобы в шаблоне не писать <?php echo $var; ?> прописать просто [*=$var*] (Что очень облегчает создание и восприятие шаблона). Сейчас шаблонизатор делает данную замену, сохраняет полученный код в файл, а затем уже подключает готовый код в сценарий и выполняет его. Я хочу обойти сохранение кода в кэш, заменить всё на лету и выполнить код из строки. Как вам такая постановка вопроса?)

Автор: Sentox 12.2.2010, 11:35
http://php.su/functions/?eval

Автор: Ant0ha 12.2.2010, 11:39
Код

<?php

eval('<?php echo "test" ?>тест');

?>


В результате:
Parse error: syntax error, unexpected '<' in /opt/lampp/htdocs/soomer-dc/test.php(3) : eval()'d code on line 1

Автор: Sentox 12.2.2010, 11:43
eval('<?php echo "test"; ?>');
При использовании eval() необходимо помнить о нескольких вещах. Запомните, что передаваемая строка обязана быть правильным кодом PHP, включая окончание операторов точкой с запятой, чтобы разборщик не отвалил на строке после eval(), и правильное escap-ирование в code_str.

Автор: Ant0ha 12.2.2010, 11:49
Да, это понятно, но код ругается на <?php, вот в чем проблема, т.е. code_str не должна содержать <?php, ?>, ей нужен просто код, как если бы он был между <?php и ?>. Поэтому eval и не подходит...

Автор: Ипатьев 12.2.2010, 11:53
Цитата(Ant0ha @  12.2.2010,  11:33 Найти цитируемый пост)
Как вам такая постановка вопроса?) 

Бессмысленная.
Я не понимаю, зачем делать два действия вместо одного.
Если мы заменяем что-то в шаблоне, то почему бы сразу [*=$var*]  на содержимое переменной $var и не заменить?

Добавлено через 2 минуты и 9 секунд
Не вижу, кстати, никакой принципиально разницы в восприятии между 
[*=$var*]
и
<?=$var?>
ну никакой, абсолютно

Автор: Ant0ha 12.2.2010, 12:37
1. Как я уже сказал измененный шаблон кэшируется, а потом берется из кэша и замена в последующие разы не выполняется.
2. Вы вроде бы и не новичек давно, а почему то элементарного не знаете.

Код

По умолчанию короткие теги не используются, их нужно специально активизировать. Это можно сделать двумя способами: 
указать ключ -enable-short-tags при компиляции РНР; 
включить параметр short_open_tag в файл php.ini.


Шаблонизатор ни для одного проекта и сервера делается, постоянно включать короткие теги для новых проектов будет ужасно не удобно, да и <?=$var?> лично мне не нравится.

3. Вопрос изначально стоял как: Возможно ли такое, если да то как? Если нет, я буду работать по старому. Еще раз говорю, пишем по делу, а не пытаемся как то доказать свое превосходство, Ипатьев.


Автор: nerezus 12.2.2010, 13:20
Цитата

Шаблонизатор ни для одного проекта и сервера делается, постоянно включать короткие теги для новых проектов будет ужасно не удобно
 А у вас вообще до этого были проекты на $100+?
Просто вопрос.

Автор: Ипатьев 12.2.2010, 14:54
Мне не нужно доказывать свое превосходство smile
Тем более, что мы говорим совсем не о нем. Речь, скорее, о разнице в опыте.
Человек (и не один в этом топике), который видел всякие шаблоны и способы их применения, может посоветовать тому, кто изобретает велосипед в первый раз. Я не вижу в этом ничего плохого. 
Когда начинающий считает свое мнение единственно правильным - вот это да, это, как мне кажется, достойно порицания.

Проблема явно высосана из пальца. 
Если вместо изобретения странного шаблонизатора вы бы воспользовались готовым - например Смарти - то проблем бы, как и потенциальной угрозы безопасности, в принципе не возникло бы



Автор: Ant0ha 12.2.2010, 15:06
Смарти я использовал и использую в некоторых проектах (т.к. этого требует заказчик), но по сути шаблонизатор типа [*= - это тот же обычный php, который используется в тех же code-igniter, joomla, bitrix и т.д. (который подходит мне больше, чем смарти), только упрощает написание и восприятие шаблона... никакого велосипеда тут нет.

З.Ы. на заметку http://larin.in/archives/16

Автор: Ипатьев 12.2.2010, 15:25
Велосипед есть.
Обычного РНР я здесь не вижу.
Вот автор по ссылке выше пишет, что не имеет смысла изобретать синтаксис [**], если можно написать <?php echo $title?>
НО ЕСЛИ уж нам ударила в голову такая идея - то это смарти и получается. Изобретаемый заново велосипед.

Добавлено @ 15:27
кстати, вспоминая смарти
если уж в нашем воображении "измененный шаблон кэшируется, а потом берется из кэша и замена в последующие разы не выполняется" - то никакой проблемы я не вижу вовсе. вообще. 
Зачем тут же выполнять измененный шаблон, если он все равно запишется в файл и потом исполнится обычным порядком? Ровно точно так же, как это делается в смарти, и никакое исполнение на лету при этом не требуется

Автор: Ant0ha 12.2.2010, 16:28
Проблема в том, что при изменении изначального шаблона, необходимо обновлять кэшированный шаблон. Но это уже другая история. Думаю, тема исчерпана.

Автор: Ипатьев 12.2.2010, 16:36
Смарти это делает автоматически.
Еще одна причина не изобретать велосипед

Автор: Fortop 12.2.2010, 18:55
Ant0ha, 
Так все же в чем вопрос и проблема топика? 

Началось все с этого -
Цитата(Ant0ha @  7.2.2010,  19:45 Найти цитируемый пост)
Как мажно подключить в скрипт строку,  а не файл? 
То есть вместо include 'test.php'; 
Прописать что-то вроде
include_string "<?php echo 'тест'; ?>";  


Продолжилось этим -
Цитата(Ant0ha @  12.2.2010,  10:33 Найти цитируемый пост)
Я хочу обойти сохранение кода в кэш, заменить всё на лету и выполнить код из строки

А смысл? 

А кончилось этим -
Цитата(Ant0ha @  12.2.2010,  15:28 Найти цитируемый пост)
Проблема в том, что при изменении изначального шаблона, необходимо обновлять кэшированный шаблон.Но это уже другая история



Автор: segrey 12.2.2010, 19:08
Цитата(Ant0ha @ 12.2.2010,  08:54)
Задача поставлена как нужно, сейчас проверил с eval() - не то... Мне нужно весь сценарий из файла прочитать в строку, внести изменения "на лету" и выполнить изменнный код из строки. Такое вообще возможно?

ну измени строку на лету и засунь в eval.

Автор: awers 12.2.2010, 19:28
Ant0ha, что то ты там не то делаешь. Сначала мне показалось что тебе для экспериментов это надо.
Запомни юный падаван: евал = зло

Автор: Elfet 14.2.2010, 21:45
Ant0ha, тоже выбирал между eval и include. 
 вот, на хабре обсуждают Eval и Include: http://habrahabr.ru/blogs/php/24038/  - выбрал Include  smile

Автор: IZ@TOP 15.2.2010, 15:59
Да, это клиника. 
Кто с эвалами зачем-то сюда идет, не почитав тему, а автору - так вообще респект. Smarty изобретать не нужно - он уже есть.

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