PHP字符串连接混乱



谁能帮我修复这个php字符串混乱?

echo '<nav class="navEl"><a href="' . $route . '" '.($_SERVER['REQUEST_URI'] == '/' . $route) ? 'style="color:' . $currentPathColor . '"' : '' . '>' . $route . '</a></nav>';

这是应该做的(This works):

if ($_SERVER['REQUEST_URI'] == '/' . $route) {
echo '<nav class="navEl"><a href="' . $route . '" style="color:' . $currentPathColor . '">' . $route . '</a></nav>';
} else {
echo '<nav class="navEl"><a href="' . $route . '">' . $route . '</a></nav>';
}

只是练习PHP的目的是了解它的一些东西,提前感谢!

我可以理解想要减少代码的重复,因此我建议将通用html放在两个单独的部分,中间是if。这与您试图获得的相同,但具有(IMHO)更可维护的结构…

echo '<nav class="navEl"><a href="' . $route;
if ($_SERVER['REQUEST_URI'] == '/' . $route) {
echo '" style="color:' . $currentPathColor;
} 
echo  '">' . $route . '</a></nav>';

(我没有测试过,所以不能100%保证报价是正确的,但我希望你能明白。)

由于PHP是一个模板引擎,您可以利用它并保持可读性。

$style = ($_SERVER['REQUEST_URI'] === "/$route") ? "style='color:$currentPathColor'" : '';
echo <<<_HTML
<nav class="navEl"><a href="$route" $style>$route</a></nav>
_HTML;

其他人已经给出了一些合理的替代样式,但是为了解决当前的问题,您的问题是操作符优先级之一。

按照优先级顺序,你有:

  1. 带括号的表达式
  2. .连接操作符
  3. 三元?:运算符

PHP的计算方式是这样的:

// Parentheses
$boolean = $_SERVER['REQUEST_URI'] == '/' . $route;
// Concatenation
$string_1 = '<nav class="navEl"><a href="' . $route . '" '. $boolean;
$string_2 = 'style="color:' . $currentPathColor . '"';
$string_3 = '' . '>' . $route . '</a></nav>';
// Ternary
$chosen_string = $string_1 ? $string_2 : $string_3;
// echo
echo $chosen_string;

但是你想要的是:

// String sections
$prefix = '<nav class="navEl"><a href="' . $route . '" ';
$suffix_a = 'style="color:' . $currentPathColor . '"';
$suffix_b = '' . '>' . $route . '</a></nav>';
// Condition
$condition = $_SERVER['REQUEST_URI'] == '/' . $route;
// Ternary
$chosen_suffix = $condition ? $suffix_a : $suffix_b;
// Combine
$string = $prefix . $chosen_suffix;
// echo
echo $string;

所以除了条件括号外,你还需要在整个"后缀"Section,让它先求值:

echo
'<nav class="navEl"><a href="' . $route . '" '
.
(
( $_SERVER['REQUEST_URI'] == '/' . $route )
?
'style="color:' . $currentPathColor . '"'
:
'' . '>' . $route . '</a></nav>'
);

由于这种错误很容易犯,并且结果很容易被误解,因此通常最好避免这样的复杂表达式,并引入中间变量,使用if语句等。

最新更新