Как стать автором
Обновить

Комментарии 70

Интересно, шорттэги существуют с версии 3.0, а то и ранее. Есть мнение (например от everzet) что это зло, а добро в использовании ненативных шаблонизаторов. Тем более, что сначала short_open_tag=on (вроде) считалось deprecated. Однако с 5.4 конструкция <?= $foo ?> включена всегда. Случались ли у кого конфликты с другими языками на практике?
С xml проблемы, да.
НЛО прилетело и опубликовало эту надпись здесь
Ок, но можно же сказать: используйте шаблонизаторы и не занимайтесь рукоделием :)

Бывает надо просто и быстро сгенерировать xml размером в несколько сотен метров, а то и несколько гигабайт в условии ограниченных ресурсов.
НЛО прилетело и опубликовало эту надпись здесь
Используйте XmlWriter.
Бывает надо просто и быстро сгенерировать xml размером в несколько сотен метров, а то и несколько гигабайт в условии ограниченных ресурсов.
XmlWriter с этим отлично справляется.
<?php if ($category_tree && count($category_tree)): ?>
    <?php foreach($category_tree as $category): ?>
        <?= $category->name ?>
    <?php endforeach; ?>
<?php else: ?>
    No items in tree
<?php endif; ?>

Хоть както полегчало за счет этого <?= $category->name ?>?
Окей окей, у вас собственный VPS, где вы можете включить шорты на начало/конец блоков кода тоже:

<? if ($category_tree && count($category_tree)): ?>
    <? foreach($category_tree as $category): ?>
        <?= $category->name ?>
    <? endforeach; ?>
<? else: ?>
    No items in tree
<? endif; ?>

Наконец ваш шаблон читабелен и лаконичен, так?
Ах и да, часто вместо <?= $category->name ?> у вас будет что-то вроде:

<? $meta = $category->getMetaInformation(); ?>
<?= $meta['name'] ?>


Сравниваем:

{{ category.metaInformation.name }}
Костя, могло быть <?= $category->getMetaInfotmation()->getName() ?> и в темплейте был бы а) автокомплит и б) возможность переименовать функции во всех местах где она используется.

Да, не очень удобно в случае множества скинов — потребуется заморозить интерфейс модели и/или поддерживать устаревшие методы. Но когда скинов не планируется, то вызовы модели кажутся удобнее. Невзирая на нелаконичные "->get" и скажем "<?=escape($text)?>".
Давай предположим, что эта метаинформация — контейнер переменного размера, в который сущности системы могут помещать что угодно и когда угодно, помимо типичной информации типа «name». В этом случае, использование объекта для представления меты излишне, хэш для этого подходит куда лучше ;-)

Да, пример достаточно редкий, но не «невозможный».
НЛО прилетело и опубликовало эту надпись здесь
То есть наличие чистого публичного API домена для вас — говнокод, а опубличивание пропертей домена с целью упрощения шаблонов — вариант «без говнокода». ОК!
НЛО прилетело и опубликовало эту надпись здесь
Мои примеры абсолютно одинаковые. Twig автоматически заресолвит:

{{ category.metaInformation.name }}

В:

$meta = $category->getMetaInformation();
echo $meta['name'];

Или в:

echo $category->getMetaInformation()->getName();

В зависимости от того, что из себя представляет $category. Это и называется отделением логики от представления.
НЛО прилетело и опубликовало эту надпись здесь
Т.е. вы специально вяжете ActiveRecord на все объекты, которые хотите выводить в шаблоне, чтобы упростить ваши шаблоны?

Давайте теперь представим, что $category собирается в памяти, никуда не персистится и имеет структуру, которую я в начале привел. Что будете делать? Привяжете туда ActiveRecord или просто добавите публичные проперти, чтобы упростить шаблон?
НЛО прилетело и опубликовало эту надпись здесь
Есть ли вообще будущее у альтернативных шаблонизаторов? Smarty, Quicky (от developer), Twig… кажется каждый (кроме Quicky) кто пишет свой шаблонизатор выдумывает новый синтаксис, самый лучший. Может следует выстрадать самый лучший синтаксис вместе прежде чем делать его реализацию?
А существует ли «самый лучший синтаксис»? Шаблонизаторы — такая же штука в этом плане, как и языки программирования. Назовите лучший :)
Мне допустим использование шаблонизаторов типа Twig нравится лишь по одной причине. Ограничивает свободу. Иногда встречаются люди, которые кусок логики запихивают прямо в шаблон, а с Twigом так вот просто этого не сделать.
Использую Jade в nodeJS. Удобным не показался. Возможно я его не до конца понял, но слишком много приходилось писать js-кода в шаблонах, к напримеру, для того, чтобы задать аттрибуты.
Не знаю как в PHP, но в Python поверх Mako всё удобно.
Как по мне абсолютно бессмысленная вещь.
В пхп вообще очень многое тырят с других языков. Например Twig это почти точь в точь шаблонизатор из Django
НЛО прилетело и опубликовало эту надпись здесь
Хорошо. В пхп очень много копируют из других языков и технологий
НЛО прилетело и опубликовало эту надпись здесь
Согласен. Этим они делают переход с пхп на другой язык-технологию ещё более простым )
Начиная с php 5.4 директива short_open_tag исчезает, а поддержка шот-тегов теперь включена всегда. Поэтому глупо не использовать их, если в качестве языка для кодирования шаблонов используется сам php.

Вы не объясните от чего вы так все «зло» воспринимаете?
Шорттеги — добро, шаблонизация через php-интерпретатор — зло.
Вы прям как Ленин с броневика… Аргументируйте пожалуйста!
А для чего Вы используете тогда шорттеги? Во имя «добра», как Вы написали
Шорттеги — ок, шаблонизатор на нативном PHP — вдвойне ОК
Я за вариант — «Не использую, потому что не известно будет ли это поддерживаться сервером, а так бы использовал с удовольствием.»
Не использую, потому что это может вызвать зло несовместимости — но стану использовать, когда PHP 5.4.0 завоюет мир (и умы хостеров), так что конструкция «<?=» сможет употребляться невозбранно.
Хотелось бы конструкцию <?php=$var ?> — решило бы проблему излишнего синтаксиса и совместимости с xml
НЛО прилетело и опубликовало эту надпись здесь
Проявление чувства юмора при составлении опроса сводит на нет адекватность результатов голосования, но подчеркивает наличие чувства юмора у большинства Хабровчан.
Использую Twig:
{{foo}}
Включаю сокращенную запись (short_open_tag) и радуюсь жизни =)

<?=$variable?>

<?foreach($arr as $v) {?>
  <?print_r($v)?>
<?}?>


XML:
<?='<?xml version="1.0" encoding="UTF-8"?>'?>


ЗЛО:
<?php echo $foo ?>

<? if(true): ?>
<? endif; ?>
НЛО прилетело и опубликовало эту надпись здесь
Обычно те, кто используют «длинный» синтаксис по причине «совместимости с xml», при прямом вопросе, в каком именно случае эта совместимость реально требуется в их проектах, не могут ничего вразумительного ответить.
НЛО прилетело и опубликовало эту надпись здесь
Это актуально для популярных опенсорс-систем типа phpbb и т.д. (впрочем, в phpbb свой шаблонизатор). Там важна совместимость, чтобы все ставилось сразу же из коробки. Таких систем — довольно мало, и трудно поверить, что большая часть программистов, фанатично использующих длинный синтаксис, на самом деле разработчики таких систем. Большинство людей пишет конкретные проекта для конкретных целей, и совместимость с шаред-хостингами (которую к тому де можно легко подправить настройками php_flag в .htaccess на большинстве хостингов) не играет значительной роли.
НЛО прилетело и опубликовало эту надпись здесь
Но даже <?=$а?> — огромное зло, потому что на самом деле в 99.9% мест, где так написано, в действительности должно было быть написано <?=htmlspecialchars($а)?>. Увы, данная архитектурная проблема тянется с самой зари php, с ней уже ничего не сделать. В мире существуют миллионы сайтов с xss благодаря ней, и число растет. Шаблонизаторы только и спасение.
А почему не экранировать данные шаблона непосредственно перед отправкой в представление?
Даже если у нас написана своя низкоуровневая быстрая f() функция, которая фильтрует что угодно — вызывать ее каждый раз как-то лень и некрасиво, разве нет?
Мне кажется, что PHP не тот язык, в котором стоило бы заниматься подобной оптимизацией. Во всяком случае в большинстве ситуаций. Напоминает экономию спичек на фоне пожара. Гораздо важнее иметь легко-понимаемый лаконичный код и структуру, которую не потребуется через пол года переписывать. Ведь такого рода действия в контроллере противоестественны. 99% проектов на PHP не имеют никаких сложностей с производительностью, более того, чаще всего оная упирается в запросы к БД или кривую логику.

А использование шаблонизаторов позволяет в разы упростить восприятие, написание вёрстки. А в случае, таких шаблонизаторов как XSLT, верстальщик ещё и лишается возможности выстрелить себе в ногу.
Таки я не говорил ничего против шаблонизаторов. Я предложил людям с развитым головным мозгом обсудить идею экранирования данных непосредственно перед отправкой в шаблон, чтобы не беспокоиться об этом в представлении и не мусорить его.
людям с развитым головным мозгом
Воспринимать как оскорбление?
обсудить идею экранирования данных непосредственно перед отправкой в шаблон
Ну а я о чём писал? На мой взгляд, это противоречит MVC, т.к. представление должно решать в каком виде необходимы данные, а не контроллер.
Воспринимать как оскорбление?

Нет.
На мой взгляд, это противоречит MVC, т.к. представление должно решать в каком виде необходимы данные, а не контроллер.

Контроллеру решать какие и в каком виде данные передаются в представление. Чем противоречит? Уже и приведение типа к целочисленному GET параметра в контроллере не сделать? :)
Уже и приведение типа к целочисленному GET параметра в контроллере не сделать
Причём тут это? Контроллер принял задачу, определил\обработал входные параметры, замучал модель и отправил итоговые данные в представление. А уж в каком виде их применит представление — дело 10-ое. Разве не так? На мой взгляд, в вашем случаем замусоривается контроллер.
Кажется мы не об одном и том же говорим. Я имею в виду нормально спроектированную систему. Мы можем переопределить класс View и переопределить метод Assign(или render, в заисимости от того как предаются данные) и автоматически принимать во вьюхе безопасные данные. Там же можно и решить проблему с получением оригинальных данных, когда нужно.

Не нужно в контроллере эту злосчастную низкоуровневую f() вызывать :D Это и правдо глупо.
Это и правдо глупо
Я использую XSLT, и никаких f() не вызываю, однако этим занимается сам шаблонизатор. Не вижу в этом никаких проблем, + всё очень гибко. Если мне в одном месте понадобится экранированные данные, а в другом нет — мне достаточно указать disable-output-escaping. Нет необходимости на уровне контроллера решать — какие данные мне передать в двух видах, какие экранировать, а какие нет. Особенно если учесть, что view-часть можно сильно измениться, без необходимости изменения логики получения итоговых данных.

Одну и ту же строку я могу использовать и как аттрибут, и как html, и как css, и как что угодно. Нет необходимости для этого лезть в controller и что-либо там менять. На мой взгляд, он, контроллер, об этом вообще ничего знать не должен. Он даже не обязан знать для чего эти данные добыл, что будет на выходе? HTML? XSLT? JSON? закодированное_письмо_для_внеземных_цивилизаций?
Дополню. Ситуация мне напоминает magic quotes.
А почему не экранировать данные шаблона непосредственно перед отправкой в представление?

Экранирование придется вызывать на месте, оно везде разное: для html нужно просто заменять &,<,>, для аттрибутов еще и экранировать кавычки, а при выводе в JS строки еще и удалять переводы строк, делать url_encode при выводе в урл и т.п.
Экранирование не надо «вызывать». Оно само должно вызываться, и сопротивляться своему выключению (даже однократному). Поэтому я и говорю, что экранирование во вью — дело шаблонизатора, а экранирование sql — дело библиотеки работы с бд. Само понятие «экранирование» — ущербно по своей природе: есть сырые данные, есть результат, а есть «серный ящик», который из первого делает второе по указанной вами инструкции (шаблонизатор, например). Нет в этой картине мира нигде никакого «экранирования».
НЛО прилетело и опубликовало эту надпись здесь
Я скорее уверен, что не более 1-2%

Думаю, вы ошибаетесь. Там около 67,2%
Прямой вывод без экранирования реально необходим в подавляющем меньшинстве случаев. Настаиваю на этом как активных пользователь ShortXSLT — disable-output-escaping приходится применять исчезающе малое число раз.
Что бы не делать <?=htmlspecialchars($a)?> нужно фильтровать и экранировать символы перед записью в db.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Удалять через str_replace лишние слэши перед выдачей *HEADWALL*
НЛО прилетело и опубликовало эту надпись здесь
Там выше писали про Magic Quotes, и я вспомнил случай на работе, когда пришлось дописывать пару фич к старинному приложению, в котором пользовательский ввод экранировался через Magic Quotes, что приводило при многократном сохранении данных к длинным рядам обратных слэшей в базе данных, которые я потом вырезал при экспорте :)
Даже и не знаю. За все время работы ни разу не встречал хостинга, где невозможно было бы использовать «короткие теги» — как минимум, эта опция была доступна в htaccess'е.

В случае, если нужно включить в документ XML тоже есть решение. Это, конечно, костыль, но не слишком некрасивый:
<<??>?xml version="1.0" encoding="UTF-8"?<??>>
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации