8

我想知道你是否可以在 heredocs 中有条件语句,这是我的脚本,但它无法正确解析 $username?

php代码:

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 :)) 谢谢

4

3 回答 3

15

简单的。将所有内容包裹在花括号中(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;
于 2015-08-11T15:52:52.960 回答
7

您想在 heredoc 中有条件语句还是想知道为什么您的代码不起作用?因为目前您在 heredoc 中没有条件语句,但无论如何也不可能。

如果您想知道为什么您的代码不起作用:
这与heredoc无关,这是因为整个$reply字符串都用单引号括起来,不支持变量解析。使用字符串连接:

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

我希望您在真实代码中使用heredoc 做更多事情,否则return $reply会更容易;)(并且您缺少括号)。

于 2010-10-25T06:02:12.890 回答
1

这个问题已经过时了,但要通过一些可能的解决方案提供更完整的答案。条件句不允许在 heredoc 的“内部”,但您可以在 heredocs 中使用条件句。

这些示例应该让您了解heredoc 的用法。请注意,heredoc 的第一行以少于 3 个符号和一些任意文本开头,第一行末尾没有空格。按回车。必须以类似方式关闭heredoc。您可能知道,用于打开heredoc 的文本必须用于关闭它,通常但不要求后跟分号。确保分号或最后一个文本字符后面没有尾随空格或字符,然后按 Enter。

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);

根据您的具体情况,您可能会发现使用类来进行您想在 heredoc 中使用的比较很有帮助。这是一个示例,说明您可以如何做到这一点。

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');
于 2012-01-07T23:31:37.500 回答