变量内部的条件


Condition inside variables

我有一个非常有效的例子:

$text = 'Lorem Ipsum';
$html = <<<HTML
<div>
   <span>$text</span>
</div>
HTML;

现在如何做到这一点,以正确的方式选择选项2:

$val = 2;
$html = <<<HTML
<select>
   <option if ($val == 1) {echo 'selected';} >Option 1</option>
   <option if ($val == 2) {echo 'selected';} >Option 2</option>
   <option if ($val == 3) {echo 'selected';} >Option 3</option>
</select>
HTML;

我认为这是模板引擎的工作,但不用担心,它非常容易使用。

你只需要用composer准备项目,然后轻松安装一个模板引擎(对于这个例子,我选择了Latté)。

作曲家安装:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php

之后安装Latté:

php composer.phar require latte/latte

最后,你可以创建这样的东西:

$latte = new 'Latte'Engine;
$latte->setTempDirectory('/path/to/tempdir');
$parameters['val'] = 2;
$html = $latte->renderToString('template.latte', $parameters);

并将此内容放入同一目录中的文件"template.latte"中:

<select>
{foreach [1, 2, 3] as $key}
    <option {if $val === $key}>Option {$key}</option>
{/foreach}
</select>

专业人士使用此解决方案的原因有很多:

  1. 把逻辑和渲染放在一起,不会把事情搞混
  2. 所有变量都会自动转义(以避免XSS)
  3. DRY(不要重复自己)原则,带选项的行应该只写一次

顺便说一句,在PHP中,您应该总是在条件中使用三重相等(同时比较变量的类型)。它更安全,并且可以使用以下原理节省大量调试时间:-)。

您必须将if语句移出heredoc:

$sel1 = $sel2 = $sel3 = '';
     if ($val == 1) $sel1 = ' selected';
else if ($val == 2) $sel2 = ' selected';
else if ($val == 3) $sel3 = ' selected';
$html = <<<HTML
<select>
   <option$sel1>Option 1</option>
   <option$sel2>Option 2</option>
   <option$sel3>Option 3</option>
</select>
HTML;

您可以使用变量缩短if/else阶梯

$sel1 = $sel2 = $sel3 = '';
${"sel$val"} = ' selected';
$html = <<<HTML
<select>
   <option$sel1>Option 1</option>
   <option$sel2>Option 2</option>
   <option$sel3>Option 3</option>
</select>
HTML;

您还可以使用数组缩短空字符串分配:

$sels = array_fill (1, 3, '');
$sels[$val] = ' selected';
$html = <<<HTML
<select>
   <option{$sels[1]}>Option 1</option>
   <option{$sels[2]}>Option 2</option>
   <option{$sels[3]}>Option 3</option>
</select>
HTML;

注:以上内容未经测试;我把它打在手机上了。