как использовать Присяжного острослова лучше с PHP?

struct Test
{
    auto foo() { /*1*/ }                       
    auto bar() -> decltype(foo()) {}
};

На маркере 1 имя Test::bar находится в области видимости вместе со всеми другими членами struct Test. Поэтому компилятор не может анализировать тело из foo() до тех пор, пока класс не будет завершен.

Затем мы имеем частичное упорядочение:

  • Разобрать тело из Test::foo() перед выводом его возвращаемого типа
  • Завершить класс Test перед анализом тела из Test::foo() [1117 ]
  • Анализ завершающего типа возвращаемого значения Test::bar() перед завершением класса Test (из вопроса, который вы указали, не является обманом)

и по транзитивности тип возвращаемого значения Test::bar() должен проанализировать, не выполняя вычет типа возврата для Test::foo().


Так как была запрошена стандартная цитата, здесь она из [class.mem]:

Класс считается полностью определенным типом объекта (или полным типом) при закрытии } ] спецификатора класса . В пределах класса спецификация члена , класс рассматривается как завершенный в теле функции , аргументах по умолчанию, спецификаторах noexcept и инициализаторах членов по умолчанию (включая такие вещи во вложенных классах). В противном случае он считается неполным в пределах своей спецификации члена класса.

7
задан nopole 17 May 2009 в 16:17
поделиться

8 ответов

Во-первых, PHP - это язык шаблонов. Помните об этом, когда говорите об использовании системы шаблонов для своих веб-приложений на основе PHP.

Единственный «реальный» аргумент, который я когда-либо слышал в пользу использования ЛЮБОГО механизма шаблонов, заключался в том, что они предоставляют более простой язык для манипулирования шаблонами. что может быть удобно, если у вас есть дизайнеры шаблонов, которые не знают PHP и которым вы не доверяете, чтобы научиться разумно использовать PHP.

Что касается этих аргументов, я бы сказал, что если ваши разработчики шаблонов не компетентны в изучении достаточного количества PHP для создания шаблонов, вам, вероятно, следует подумать о поиске новых дизайнеров шаблонов. Кроме того, сам PHP предоставляет другой синтаксис для управляющих операторов, которые вы можете использовать в шаблоне и в коде. Например:

<? foreach($array as $key => $val): ?>
    <?= $val ?>
<? endforeach; ?>

VS:

<?php
    foreach($array as $key => $val) {
        echo $val;
    }

?>

Лично Я считаю, что механизмы создания шаблонов возникли в PHP, потому что:

  1. Так делают другие языки
  2. Лучшие программисты PHP осознали, что им нужен способ принудительного разделения между логикой представления и логикой приложения, и шаблоны были простым способом сделать это.

Первая причина довольно глупая. Вторую причину можно преодолеть с помощью небольшого самоконтроля и даже элементарного понимания необходимости разделения слоев в приложении. Шаблон проектирования MVC - один из способов решения этой проблемы. Что касается некоторого самоконтроля, мое правило состоит в том, что используются только необходимые циклы и операторы if, а также функции, которые фильтруют, экранируют, форматируют вывод для экрана.

Широко использовав Smarty, я могу честно сказать, что это всегда создавало для меня больше препятствий, чем решений.

22
ответ дан 6 December 2019 в 05:06
поделиться

Мне не нравятся движки шаблонов. Я нахожу их очень затратными и ресурсоемкими для PHP.

В MediaWiki в версии 1.6.x мы отказались от использования Smarty по умолчанию и просто использовали встроенные шаблоны PHP, что значительно улучшило производительность.

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

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

6
ответ дан 6 December 2019 в 05:06
поделиться

Мне нравятся механизмы шаблонов, и я думаю, что их следует использовать, но в конкретном случае Smarty я считаю, что это пустая трата времени, потому что это не является значительным улучшением по сравнению с PHP как языком шаблонов:

  • Новый синтаксис по-прежнему основан на старой концепции специальных тегов, вставляемых в случайные места в документе.
  • Поскольку Smarty не понимает синтаксис / структуру HTML, он не может не помочь вам создать действительный / правильно сформированный HTML. Теги Smarty нарушают синтаксис HTML, поэтому, как только вы их добавите, другие стандартные инструменты тоже не смогут вам помочь.
  • Вывод Smarty, как и в PHP, по умолчанию небезопасен (без экранирования), и вам придется не забудьте добавить | escape везде, где вы выводите данные в HTML.

Есть один конкретный механизм шаблонов PHP, который я '

3
ответ дан 6 December 2019 в 05:06
поделиться

Smarty, безусловно, один из лучших шаблонизаторов. По моему опыту, людям было бы хорошо посоветовать более тщательно продумать варианты использования, прежде чем они вообще будут использовать какой-либо движок шаблонов поверх PHP.

Во-первых, сам PHP идеально подходит для шаблонов. Практически единственным оправданием использования другого механизма шаблонов является то, что вы позволяете ненадежным пользователям создавать или редактировать шаблоны, поскольку они могут совершать все виды вредоносных действий. Итак, если в вашем проекте есть шаблоны, редактируемые пользователем, используйте Smarty. Если нет, придерживайтесь PHP.

Если ваша проблема заключается в разделении кода и макета, я предлагаю вам рассмотреть возможность реализации облегченной модели выполнения в стиле MVC. Или, выражаясь более снисходительно, если у вас есть более глубокий логический код в вашем шаблоне, вероятно, пора провести некоторый рефакторинг.

Производительность - другое соображение. Да, рендеринг шаблона Smarty требует затрат. Но после этого вывод должен быть кэширован, что приведет к сокращению времени выполнения. То же самое и с шаблонами PHP. PHP позволяет реализовать все виды моделей детального кэширования с помощью выходных буферов. Но будьте осторожны с преждевременной оптимизацией: делайте это только после того, как вы закончите код и определите, каковы фактические узкие места!

Самая большая цена при использовании Smarty или любого другого движка связана с временем разработчика. Это еще один уровень сложности, и вы неизбежно попадете в ситуации, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать в чистом PHP все это время.

Но после этого вывод должен быть кэширован, что приведет к сокращению времени выполнения. То же самое и с шаблонами PHP. PHP позволяет реализовать все виды моделей детального кэширования с помощью выходных буферов. Но будьте осторожны с преждевременной оптимизацией: делайте это только после того, как вы закончите код и определите, каковы фактические узкие места!

Самая большая цена при использовании Smarty или любого другого движка связана с временем разработчика. Это еще один уровень сложности, и вы неизбежно попадете в ситуации, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать в чистом PHP все это время.

Но после этого вывод должен быть кэширован, что приведет к сокращению времени выполнения. То же самое и с шаблонами PHP. PHP позволяет реализовать все виды моделей детального кэширования с помощью выходных буферов. Но будьте осторожны с преждевременной оптимизацией: делайте это только после того, как вы закончите код и определите, каковы фактические узкие места!

Самая большая цена при использовании Smarty или любого другого движка связана с временем разработчика. Это еще один уровень сложности, и вы неизбежно попадете в ситуации, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать в чистом PHP все это время.

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

Самая большая цена при использовании Smarty или любого другого движка связана с временем разработчика. Это еще один уровень сложности, и вы неизбежно попадете в ситуации, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать в чистом PHP все это время.

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

Самая большая цена при использовании Smarty или любого другого движка связана с временем разработчика. Это еще один уровень сложности, и вы неизбежно попадете в ситуации, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать в чистом PHP все это время.

4
ответ дан 6 December 2019 в 05:06
поделиться

Плюсы

  • Отсутствие PHP в ваших файлах HTML (позволяет идентифицировать как PHP, так и HTML)
  • Каналы {$ var | default: "Не выбрано"} {$ var | urlencode}
  • Foreachelse: {foreach item = row from = $ results} {$ row.name}
    {foreachelse} Нет результатов {/ foreach}
  • Тематические веб-сайты / страницы (при использовании только CSS есть ограничения)

Минусы

  • Синтаксис другого языка
  • Не всегда очевидный код {"Ymd" | strftime: $ timestamp} {$ array | @var_dump}
  • Небольшие накладные расходы

Я настоятельно рекомендую "шаблонный" подход (mVc ), но и Smarty, и простой PHP справятся с этой задачей.

2
ответ дан 6 December 2019 в 05:06
поделиться

Насколько я знаю, Smarty - один из лучших шаблонизаторов с точки зрения скорости. Может быть, нужно время, чтобы к этому привыкнуть. Но если вы работаете не только с системой, и количество файлов HTML и стилей огромно, это значительно ускоряет разработку.

Во время работы над моим последним проектом дизайн несколько раз менялся, но логика осталась прежней. Думаю, это лучший пример, когда Smarty или любой другой шаблонизатор очень помогает.

1
ответ дан 6 December 2019 в 05:06
поделиться

Лично я использую Blitz для создания шаблонов. На сайте автор утверждает, что это самый быстрый шаблонизатор и предоставляет (предвзятую?) Диаграмму производительности между различными системами шаблонов для PHP. Я сам не использовал smarty, но это может дать вам некоторые подсказки относительно его производительности.

http://alexeyrybak.com/blitz/blitz_en.html

1
ответ дан 6 December 2019 в 05:06
поделиться

Использование Smarty в качестве механизма создания шаблонов, вероятно, не будет таким эффективным, как его неиспользование, поскольку это дополнительный уровень программного обеспечения, то есть язык шаблонов поверх, хм, еще одного шаблона язык. С другой стороны, если вы правильно используете функцию кэширования, вы можете получить общий прирост производительности.

Шаблоны Smarty предварительно компилируются перед выводом в браузер, что включает запись временных файлов на диск. Этот шаг, безусловно, снижает производительность, по крайней мере, немного.

Если вы уверены в своей способности разделять реализацию и представление и не имеете реального интереса к кэшированию на стороне сервера, вам, вероятно, следует просто использовать чистые шаблоны php. Некоторые инфраструктуры MVC, такие как Zend Framework , имеют свои собственные системы шаблонов, подобные PHP.

С другой стороны, smarty - хороший способ четко отделить презентацию от реализации, особенно там, где неясно, что и где принадлежит. Это может помочь дисциплинировать вас, чтобы обеспечить это необходимое разделение.

Тем не менее, я использую Smarty в большинстве своих проектов PHP, поскольку он напоминает мне библиотеки тегов Java-Server (JSTL), к которым я очень, очень привык , и фонд.

1
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: