Вопрос по string, php – Вызов функций PHP в строках HEREDOC

85

В PHP строковые объявления HEREDOC действительно полезны для вывода блока html. Вы можете анализировать переменные, просто ставя перед ними префикс $, но для более сложного синтаксиса (например, $ var [2] [3]) вы должны поместить свое выражение в фигурные скобки {}.

В PHP 5 этоis можно на самом деле делать вызовы функций в фигурных скобках {} внутри строки HEREDOC, но вам придется проделать небольшую работу. Само имя функции должно храниться в переменной, и вы должны вызывать его, как если бы это была функция с динамическим именем. Например:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;

Как видите, это немного более грязно, чем просто:

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;

Есть и другие способы, кроме первого примера кода, такие как выход из HEREDOC для вызова функции или решение проблемы и выполнение чего-то вроде:

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>

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

Итак, суть моего вопроса такова: есть ли более элегантный подход к этому?

Edit based on responses: Конечно, кажется, что какой-то движок шаблонов сделает мою жизнь намного проще, но это потребует от меня инверсии моего обычного стиля PHP. Не то, чтобы это было плохо, но это объясняет мою инерцию. Хотя я и собираюсь найти способы облегчить жизнь, поэтому сейчас я ищу шаблоны.

Error: User Rate Limit ExceededText {$string1} Text {$string2} Text в наследстве. rinogo

Ваш Ответ

16   ответов
5

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

$page_content = getPageContent();

print <<<END
<html>
<head>
  <title>$page_title</title>
</head>
<body>
$page_content
</body>
END;

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
38

$string = <<< heredoc
plain text and now a function: %s
heredoc;
$string = sprintf($string, testfunction());

Не уверен, что вы считаете это более элегантным ...

1
<div><?=<<<heredoc
Use heredoc and functions in ONE statement.
Show lower case ABC="
heredoc
. strtolower('ABC') . <<<heredoc
".  And that is it!
heredoc
?></div>
0
<?php
echo <<<ETO
<h1>Hellow ETO</h1>
ETO;

52

No option for WYSIWYG No code completion for HTML from IDEs Output (HTML) locked to logic files You end up having to use hacks like what you're trying to do now to achieve more complex templating, such as looping

<?php а также?> разделители.

template_file.php

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

index.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded<?=$valueToEcho;?>Error: User Rate Limit Exceeded<%=$valueToEcho;%>Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded<?=$title?>Error: User Rate Limit ExceededmuchError: User Rate Limit ExceededButError: User Rate Limit ExceededPHP 5.4Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededtypingError: User Rate Limit ExceededreadingError: User Rate Limit ExceededMUCHError: User Rate Limit Exceeded(And BTW, it's 7 character time how ever many times it's used in a given HTML fragment. But I digress.)
9

Я бы просто использовал выходной буфер. Таким образом, в основном вы начинаете буферизацию с помощью ob_start (), а затем включаете свой «файл шаблона». с любыми функциями, переменными и т. д. внутри него, получите содержимое буфера и запишите его в строку, а затем закройте буфер. Затем вы использовали любые переменные, которые вам нужны, вы можете запустить любую функцию, и у вас все еще есть подсветка синтаксиса HTML, доступная в вашей IDE.

Вот что я имею в виду:

Template File:

<?php echo "plain text and now a function: " . testfunction(); ?>

Script:

<?php
ob_start();
include "template_file.php";
$output_string = ob_get_contents();
ob_end_clean();
echo $output_string;
?>

Таким образом, скрипт включает template_file.php в свой буфер, выполняя любые функции / методы и назначая любые переменные по пути. Затем вы просто записываете содержимое буфера в переменную и делаете с ней все, что хотите.

Error: User Rate Limit Exceeded
17

либо создайте ее в случае необходимости):

<?php
  class Fn {
    public function __call($name, $args) {
      if (function_exists($name)) {
        return call_user_func_array($name, $args);
      }
    }
  }

  $fn = new Fn();
?>

Error: User Rate Limit Exceeded$fnError: User Rate Limit Exceededtestfunction()Error: User Rate Limit Exceeded{$fn->testfunction()}

По сути, мы упаковываем все функции в экземпляр класса и используем PHP.__call magicError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcall_user_func_arrayError: User Rate Limit Exceededphp.net/manual/en/function.call-user-func-array.php#97473
2

$or=function($c,$t,$f){return$c?$t:$f;};
echo <<<TRUEFALSE
    The best color ever is {$or(rand(0,1),'green','black')}
TRUEFALSE;

5

function add ($int) { return $int + 1; }
$f=get_defined_functions();foreach($f[user]as$v){$$v=$v;}

$string = <<< heredoc
plain text and now a function: {$add(1)}
heredoc;

6

!${''} black magic :

echo <<<EOT
One month ago was ${!${''} = date('Y-m-d H:i:s', strtotime('-1 month'))}.
EOT;
Error: User Rate Limit ExceededNANError: User Rate Limit Exceeded"${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}".
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfalse == ''Error: User Rate Limit Exceeded''Error: User Rate Limit Exceeded${''} = date('Y-m-d H:i:s', strtotime('-1 month'))Error: User Rate Limit Exceeded!Error: User Rate Limit Exceeded${false}). falseError: User Rate Limit Exceeded(string)false === ''Error: User Rate Limit Exceeded"${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}".
59

function fn($data) {
  return $data;
}
$fn = 'fn';

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;
Error: User Rate Limit Exceeded$fn=function($data){return $data;};Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded$my_string = "Half the number of seconds since the Unix Epoch: {$fn(time() / 2 . ' Yes! Really!')}";
Error: User Rate Limit Exceeded$fn = function ($data) { return $data; };
Error: User Rate Limit Exceeded$fn = function fn($data) { return $data; };
Error: User Rate Limit Exceeded
1

2

Error: User Rate Limit Exceeded Doug Kavendek
2

function double($i)
{ return $i*2; }

function triple($i)
{ return $i*3;}

$tab = 'double';
echo "{$tab(5)} is $tab 5<br>";

$tab = 'triple';
echo "{$tab(5)} is $tab 5<br>";

5

function heredoc($param) {
    // just return whatever has been passed to us
    return $param;
}

$heredoc = 'heredoc';

$string = <<<HEREDOC
\$heredoc is now a generic function that can be used in all sorts of ways:
Output the result of a function: {$heredoc(date('r'))}
Output the value of a constant: {$heredoc(__FILE__)}
Static methods work just as well: {$heredoc(MyClass::getSomething())}
2 + 2 equals {$heredoc(2+2)}
HEREDOC;

// The same works not only with HEREDOC strings,
// but with double-quoted strings as well:
$string = "{$heredoc(2+2)}";
Error: User Rate Limit Exceededstackoverflow.com/a/10713298/1166898
4

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