echo 函数跳转到 Div 之外

joh*_*ith 4 php twitter-bootstrap

我创建了一个用于 gettext 翻译的函数,该函数位于头文件中:

function _ex($text){
  echo gettext($text);
}
Run Code Online (Sandbox Code Playgroud)

当我使用函数 _ex(""); 时 它会翻译该函数中的任何文本,效果很好,尽管当我在另一个内部有 div 的函数中使用它时,如下所示:

    echo '
          <div class="row row-centered">
          <div class="col-md-3"></div>
          <div class="col-md-5">
          <div class="alert alert-danger">
          <strong>' . _ex("Oh snap!"). '</strong> You are banned. <b><u>Do not</u></b> register another account
          <br>Reason you are banned: <b><u>'.$banneduser->reason.'</u></b>
          </div>
          </div>
          </div>';
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它跳出了 div col-md-5 并最终显示如下:

分区

它可以在其他一些文件中工作,但不能在这个文件中工作。我有 ' 。_前任(””) 。' 所以它在回声内部起作用。这背后是否有原因,开盘报价是否取消了div?是不是因为重复了两次?有什么方法可以阻止这种情况而不必重写我的所有代码?结束第一个 echo,然后使用该函数并重新打开另一个 echo?是否有一个函数可以检查它是否已经被回显(如果它只是返回而不是回显)?

sja*_*agr 5

当您在_ex("Oh snap!")另一个内部调用时echo,您正在执行以下操作:

echo 'Some text' . echo 'Oh snap!' . 'more text';
Run Code Online (Sandbox Code Playgroud)

这可能会产生不可预测的结果,因为连接echo将首先完全执行,然后包含的echo将完成。演示在这里。将您的函数更改_ex为如下所示:

function _ex($text){
  return gettext($text);
}
Run Code Online (Sandbox Code Playgroud)

并且总是_ex这样调用:

echo _ex('Oh snap!');
Run Code Online (Sandbox Code Playgroud)

或者通过串联,您现在可以根据需要在我的答案中使用第一行,或者在您的问题中使用您自己的代码。

保留现有代码的唯一替代方法是为连接语句编写一个新函数:

function _exx($text) {
    return gettext($text);
}
Run Code Online (Sandbox Code Playgroud)

向函数添加另一个参数_ex以处理上下文(类似于print_r它的作用:

function _ex($text, $return = false) {
    if ($return) {
        return gettext($text);
    }
    echo gettext($text);
}
Run Code Online (Sandbox Code Playgroud)

然后调用:

echo 'Some text' . _ex("Oh snap!", true) . ' more text';
Run Code Online (Sandbox Code Playgroud)

或者重写现有的 echo:

echo '
          <div class="row row-centered">
          <div class="col-md-3"></div>
          <div class="col-md-5">
          <div class="alert alert-danger">
          <strong>';
_ex("Oh snap!");
echo '</strong> You are banned. <b><u>Do not</u></b> register another account
          <br>Reason you are banned: <b><u>'.$banneduser->reason.'</u></b>
          </div>
          </div>
          </div>';
Run Code Online (Sandbox Code Playgroud)

但第一个和第二个选项是“最佳实践” - 您不应该echo在函数调用中使用,因为它会导致您的问题中出现这些问题。