условные выражения внутри синтаксиса php heredocs? - PullRequest
5 голосов
/ 25 октября 2010

Мне было интересно, если у вас есть условные отчеты внутри heredocs, это мой сценарий, но он не может правильно разобрать $ username?

php code:

function doSomething($username) {

if (isset($_SESSION['u_name'])){
$reply ='<a class ="reply" href="viewtopic.php?replyto=@$username.&status_id=$id&reply_name=$username"> reply </a>';

return <<<ENDOFRETURN

$reply

ENDOFRETURN;

проблемас этим переменная $ username deosnt будет отображаться в HTML.осталось $ username :)) спасибо

Ответы [ 3 ]

8 голосов
/ 11 августа 2015

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

Пример:

// - ############# If statement + function to set #################


$result = function ($arg1 = false, $arg2 = false)
{
    return 'function works';
};

$if = function ($condition, $true, $false) { return $condition ? $true : $false; };


// - ############# Setting Variables (also using heredoc) #########


$set = <<<HTML
bal blah dasdas<br/>
sdadssa
HTML;

$empty = <<<HTML
data is empty
HTML;

$var = 'setting the variable';


// - ############## The Heredoc ###################################


echo <<<HTML
<div style="padding-left: 34px; padding-bottom: 18px;font-size: 52px; color: #B0C218;">
    {$if(isset($var), $set, $empty)}
    <br/><br/>
    {$result()}
</div>
HTML;
6 голосов
/ 25 октября 2010

Хотите ли вы иметь условные выражения в heredoc или вам интересно, почему ваш код не работает? Потому что в настоящее время у вас есть нет условного оператора внутри heredoc, но это все равно невозможно.

Если вам интересно, почему ваш код не работает:
Это не связано с heredoc, это потому, что вся строка $reply заключена в одинарные кавычки , где разбор переменных не поддерживается. Использовать конкатенацию строк:

$reply ='<a class ="reply" href="viewtopic.php?replyto=@' . $username . '.&status_id=$id&reply_name=' . $username . '"> reply </a>'

Я надеюсь, что вы делаете больше с heredoc в своем реальном коде, иначе return $reply будет проще;) (и вам не хватает скобок).

0 голосов
/ 08 января 2012

Этот вопрос немного устарел, но дает более полный ответ с несколькими возможными решениями.Условные выражения не допускаются «внутри» heredoc, но вы можете использовать условные выражения с heredocs.

Эти примеры должны дать вам представление об использовании heredoc.Обратите внимание, что первая строка heredoc начинается с 3 символов меньше и некоторого произвольного текста без пробела в конце первой строки.Нажмите Ввод.Эредок должен быть закрыт аналогичным образом.Как вы, вероятно, знаете, текст, используемый для открытия heredoc, должен использоваться для его закрытия, за которым обычно, но не обязательно, ставится точка с запятой.Убедитесь, что после запятой или последнего текстового символа нет пробельных символов или пробелов, а затем нажмите клавишу ввода.

function doSomething($username = '', $status_id = '') {

  if ('' != $username && '' != $status_id) {

    $reply = <<<EOT
<a class ="reply" href="viewtopic.php?replyto=@{$username}&status_id={$status_id}&reply_name={$username}"> reply </a>

EOT;

  } else {

    $reply = <<<EOT
<h2>The username was not set!</h2>

EOT;

  }

  return $reply;

}

echo doSomething('Bob Tester', 12);
echo doSomething('Bob Tester');
echo doSomething('', 12);

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

class Test {

  function Compare($a = '', $b = '') {

    if ($a == $b) 
      return $a;

    else
      return 'Guest';

  }

};

function doSomething($username = '') {

  $Test = new Test;

  $unme = 'Bob Tester';

  $reply = <<<EOT
  <h2>Example usage:</h2>
  Welcome {$Test->Compare($username, '')}<br />
  <br />
  Or<br />
  <br />
  Welcome {$Test->Compare($username, $unme)}

EOT;

  return $reply;

}

echo doSomething('Bob Tester');
...