Что лучший способ состоит в том, чтобы вставить HTML через PHP?

Немного другая проблема, которая вызывает очень похожие сообщения компилятора, зависит от времени жизни объекта, а не для хранения явной ссылки. Примером этого является библиотека ssh2 . При разработке чего-то большего, чем тестовый проект, возникает соблазн попытаться помещать Session и Channel, полученные из этого сеанса рядом друг с другом, в структуру, скрывая детали реализации от пользователя. Однако обратите внимание, что определение Channel имеет время жизни 'sess в аннотации типа, а Session - нет.

вызывает аналогичные ошибки компилятора, связанные со временем жизни.

Один из способов его решения очень простым образом - объявить Session снаружи в вызывающем, а затем для аннотации ссылки в структуре со временем жизни, подобный ответ в , этот пост Форума пользователя Rust говорит об одной и той же проблеме при инкапсуляции SFTP. Это не будет выглядеть элегантно и может не всегда применяться - потому что теперь у вас есть два объекта для работы, а не тот, который вам нужен!

Выключает арендованный ящик или owning_ref crate из другого ответа также являются решениями для этой проблемы. Рассмотрим owning_ref, который имеет специальный объект для этой цели: OwningHandle . Чтобы избежать перемещения основного объекта, мы выделяем его в куче, используя Box, что дает нам следующее возможное решение:

use ssh2::{Channel, Error, Session};
use std::net::TcpStream;

use owning_ref::OwningHandle;

struct DeviceSSHConnection {
    tcp: TcpStream,
    channel: OwningHandle, Box>>,
}

impl DeviceSSHConnection {
    fn new(targ: &str, c_user: &str, c_pass: &str) -> Self {
        use std::net::TcpStream;
        let mut session = Session::new().unwrap();
        let mut tcp = TcpStream::connect(targ).unwrap();

        session.handshake(&tcp).unwrap();
        session.set_timeout(5000);
        session.userauth_password(c_user, c_pass).unwrap();

        let mut sess = Box::new(session);
        let mut oref = OwningHandle::new_with_fn(
            sess,
            unsafe { |x| Box::new((*x).channel_session().unwrap()) },
        );

        oref.shell().unwrap();
        let ret = DeviceSSHConnection {
            tcp: tcp,
            channel: oref,
        };
        ret
    }
}

. Результатом этого кода является то, что мы не можем использовать Session, но он сохраняется вместе с Channel, который мы будем использовать. Поскольку OwningHandle вызывает раздел Box, который разделяет Channel, когда он хранится в структуре, мы называем его как таковой. ПРИМЕЧАНИЕ. Это только мое понимание. У меня есть подозрение, что это может быть неверно, поскольку оно, по-видимому, очень близко к обсуждению OwningHandle небезопасности .

. Любопытная деталь здесь заключается в том, что Session логически имеет аналогичную связь с TcpStream, поскольку Channel имеет значение Session, но его собственность не принимается и нет аннотаций типа вокруг так. Вместо этого пользователь должен позаботиться об этом, поскольку в документации к методу рукопожатия говорится:

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

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

blockquote>

Таким образом, использование TcpStream полностью зависит от программиста, чтобы обеспечить правильность кода. С OwningHandle внимание к тому, где происходит «опасная магия», выполняется с помощью блока unsafe {}.

Дальнейшее и более высокоуровневое обсуждение этой проблемы находится в этом Rust User's Forum - который включает в себя другой пример и его решение с использованием ящика для аренды, который не содержит небезопасных блоков.

26
задан Ken 18 November 2008 в 13:05
поделиться

11 ответов

Если Вы собираетесь сделать вещи тот путь, Вы хотите разделить свою логику и дизайн, верный.

, Но Вы не должны использовать Присяжного острослова, чтобы сделать это.

Приоритет о мышлении. Я видел, что люди делают шокирующие вещи в Присяжном острослове, и это в конечном счете превращается в людей, разрабатывающих сайты в [1 116] Присяжный острослов, и затем некоторый умник решит, что они должны записать, движок шаблонов в Присяжном острослове (Никогда не недооценивают потенциал немой идеи).

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

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

Layout.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

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

<час>

, Кроме того, если Вы решаете использовать механизм шаблонной обработки, попытка получает тот, который выходит из HTML [1 117] значение по умолчанию , и Вы "отказываетесь" вместо, "подписываются". Вы сохраните себя много головных болей XSS. Присяжный острослов слаб в этом отношении, и из-за этого, существует много довольных-naГЇve шаблоны, записанные в нем.

{if $cond}
    {$dangerous_value}
{else}
    {$equally_dangerous_value}
{/if}

обычно, как идут шаблоны Присяжного острослова. Проблемой является $dangerous_value, может быть произвольный HTML, и это просто приводит к даже [еще 1118] плохие методы кодирования с непрослеживаемым запутанным кодом везде.

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

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}

Таким образом, Ваши потенциальные дверные проемы для эксплуатации являются легко заметными в шаблоне, в противоположность дверному проему к эксплуатации, являющейся ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ поведение.

25
ответ дан reformed 15 October 2019 в 07:47
поделиться

-1 для типичного истеричного ‘use [моя любимая система шаблонной обработки] вместо этого! Сообщения ’. Каждое сообщение PHP, даже если собственный ответ PHP является остротой, всегда ухудшается в это, так же, как каждая острота, вопрос о JavaScript заканчивается полный ‘use [моя любимая платформа] вместо этого! ’. Неловко.

Серьезно, мы знаем о разделении проблемы представления и бизнес-логика. Можно сделать, that —  or не делают that —  in любая система шаблонной обработки, ли PHP, Присяжный острослов или что-то совершенно другое. Никакая система шаблонной обработки волшебно не разделяет Ваши проблемы без набора взглядов.

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

Для ответа на вопрос, который задали первый пример в порядке, но очень трудный читать из-за плохого добавления отступа. См. пример monzee для более читаемого пути; можно использовать: нотация или {} s, какой бы ни Вы предпочитаете, но важная вещь для удобочитаемости состоит в том, чтобы сохранить Ваш HTML и PHP как сингл, ‘well-formed’ расположенная с отступом иерархия.

И заключительная просьба: помните htmlspecialchars (). Каждый раз, когда простой текст должен войти к веб-странице, это должно использоваться, или это - XSS на всем протяжении пола. Я знаю, что этот вопрос непосредственно не связан с этим, но каждый раз, когда мы отправляем пример кода включая <? эхо php ($title)?> или платформа, эквивалентная без выхода, мы поощряем продолжение зоны бедствия безопасности, которой стало большинство приложений PHP.

14
ответ дан bobince 15 October 2019 в 07:47
поделиться

Наиболее важное соображение разделяет логику от представления - меньше связи будет делать будущие изменения в обоих намного более простыми.

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

7
ответ дан Ken 15 October 2019 в 07:47
поделиться

Для очень простого случая как это хорошо использовать PHP в качестве шаблона. Однако, если Вы идете вне простой логики (и Вы, скорее всего, будете), это - хорошая идея использовать движки шаблонов.

В Платформе Зенда, которая использует сценарии представления PHP по умолчанию, рекомендуемый способ сделать, это было бы похоже на это:

<?php if ($a) : ?>
    [MARKUP HERE]
<?php else : ?>
    [SOME MORE MARKUP]
<?php endif ?>

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

4
ответ дан monzee 15 October 2019 в 07:47
поделиться

Это лучше к абсолютно отдельному Ваша логика (код PHP) от представления (HTML), при помощи движка шаблонов.

Это быстро и легко вставить PHP в HTML, но это становится грязным очень быстрый, и очень трудно поддержать. Это очень быстро и очень грязный подход...

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

2
ответ дан Community 15 October 2019 в 07:47
поделиться

Ни один. Используйте Присяжный острослов . Путем разделения внутренней логики от логики дисплея Вы создадите код, который намного более прост поддержать. (Не берите путь старой шаблонной системы PHPLIB, которая попробовала к абсолютно отдельному PHP и HTML - это требует, чтобы логика дисплея была смешана с Вашей логикой основного бизнеса, и очень грязно.), Если абсолютно необходимо генерировать отрывки HTML в коде PHP, используйте 2-й метод, но передайте переменную Присяжному острослову.

1
ответ дан Jeremy Weathers 15 October 2019 в 07:47
поделиться

Если движок шаблонов кажется большой части стычки, можно сделать движок шаблонов собственного бедного человека. Этот пример должен определенно быть улучшен и не подходит для всех задач, но для меньших сайтов могло бы подойти. Только получить Вас идея:

template.inc:

<html><head><title>%title%</title></head><body>
%mainbody%
Bla bla bla <a href="%linkurl%">%linkname%</a>.
</body></html>

index.php:

<?php
$title = getTitle();
$mainbody = getMainBody();
$linkurl = getLinkUrl();
$linkname = getLinkName();
$search = array("/%title%/", "/%mainbody%/", "/%linkurl%/", "/%linkname%/");
$replace = array($title, $mainbody, $linkurl, $linkname);
$template = file_get_contents("template.inc");
print preg_replace($search, $replace, $template);
?>
1
ответ дан neu242 15 October 2019 в 07:47
поделиться

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

Иначе большинство платформ PHP и CMS молодого поколения имеют свою собственную систему шаблонной обработки.

В целом идея системы шаблонной обработки состоит в том, чтобы иметь файлы, которые содержат почти только HTML (Файл Представления/Шаблона) и файлы, которые содержат только данные или правила бизнеса (Модель или Файлы Контроллера).

Шаблонный Файл А может выглядеть примерно так (пример от SilverStripe):

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <% base_tag %>
        $MetaTags
        <link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" />
    </head>
    <body>
        <div id="Main">
            <ul id="Menu1">
                <% control Menu(1) %>
                <li class="$LinkingMode">
                    <a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a>
                </li>
                <% end_control %>
            </ul>
            <div id="Header">
                <h1>$Title</h1>
            </div>
            <div id="ContentContainer">
                $Layout
            </div>
            <div id="Footer">
                <span>Some Text</span>
            </div>
        </div>
     </body>
</html>

Вы видите, что существует только несколько частей некода HTML, вставленных в места, где данные будут вставлены, прежде чем страница отправляется клиенту.

Ваш код может тогда (упрощенный), скорее смотрят что-то как:

<?php
  unset($out);
  if($a) $out = '[SOME CONTENT TO INSERT INTO THE TEMPLATE]';
  else $out = '[SOME ALTERNATIVE CONTENT]';
  templateInsert($out);
?>

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

1
ответ дан markus 15 October 2019 в 07:47
поделиться

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

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

1
ответ дан 15 October 2019 в 07:47
поделиться

Если Вы должны делать это, так или иначе используют фигурные скобки. Не повторяйте HTML с PHP.

1
ответ дан PartialOrder 15 October 2019 в 07:47
поделиться

Не используйте присяжного острослова - PHP является системой шаблонной обработки сам по себе. Рассмотрите использование этого синтаксиса:

<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>
0
ответ дан adnam 15 October 2019 в 07:47
поделиться
Другие вопросы по тегам:

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