在 else 分支中包含松散比较的三元表达式会产生意外结果
Ternary expression containing loose comparison in else branch yields unexpected result
有人可以帮我处理这段代码吗?在我的网站上,没有结果。
<?php
if (isset($_GET['id']) ? $product['valid2'] : ''==1) {
echo "Yes";
} elseif (isset($_GET['id']) ? $product['valid2'] : ''==0) {
echo "No";
}
根据您的评论,您似乎只想检查 id 是否已设置或未分配给 0。
这可以通过简单检查它是否存在然后将值转换为布尔值来实现。这会将 > 0 的值分配给 true,0 分配给 false。
$id = filter_input(INPUT_GET, 'id');
$idIsSet = (bool) $id;
if (!$idIsSet) {
// Id is not set so do something to handle this.
echo "No";
die();
}
// The Id is set so you can do whatever you want with the Id.
echo "Yes";
我用这个函数解决了它:
<?php
$v2 = isset($_GET['id']) ? $product['valid2'] : '';
if ($v2==1) {
echo "Yes";
} elseif ($v2==0) {
echo "No";
}
?>
感谢大家的回答!
根据php中的Operator Precedence规则(可以在不同的php版本之间改变),松散的“比较”(==
)享有比“三元”(? :
).
这意味着在 isset()
检查之前计算松散比较部分。
同样重要的是要表达从 php8 ''==0
计算为 false
,而在 php8 以下的版本中相同的表达式计算为 true
.资源:https://www.php.net/manual/en/migration80.incompatible.php
归结起来,您的 if
和 elseif
表达式正在执行 truthy/falsey 检查。
- 如前所述,首先执行三元表达式的松散比较分支。
- 如果
isset($_GET['id'])
为真,$product['valid2']
的值被计算为truthy/falsey。
- 如果
isset($_GET['id'])
为假,松散比较的值被评估为truthy/falsey。
在不熟悉你的项目的情况下,用下面的方式表达逻辑可能是直接的、正确的、可读的。
echo isset($_GET['id']) && $product['valid2'] == 1 ? 'Yes' : 'No';
这并不是为了复制您的代码逻辑,而是为了改进它并确保您始终收到 yes/no 结果。
有人可以帮我处理这段代码吗?在我的网站上,没有结果。
<?php
if (isset($_GET['id']) ? $product['valid2'] : ''==1) {
echo "Yes";
} elseif (isset($_GET['id']) ? $product['valid2'] : ''==0) {
echo "No";
}
根据您的评论,您似乎只想检查 id 是否已设置或未分配给 0。
这可以通过简单检查它是否存在然后将值转换为布尔值来实现。这会将 > 0 的值分配给 true,0 分配给 false。
$id = filter_input(INPUT_GET, 'id');
$idIsSet = (bool) $id;
if (!$idIsSet) {
// Id is not set so do something to handle this.
echo "No";
die();
}
// The Id is set so you can do whatever you want with the Id.
echo "Yes";
我用这个函数解决了它:
<?php
$v2 = isset($_GET['id']) ? $product['valid2'] : '';
if ($v2==1) {
echo "Yes";
} elseif ($v2==0) {
echo "No";
}
?>
感谢大家的回答!
根据php中的Operator Precedence规则(可以在不同的php版本之间改变),松散的“比较”(==
)享有比“三元”(? :
).
这意味着在 isset()
检查之前计算松散比较部分。
同样重要的是要表达从 php8 ''==0
计算为 false
,而在 php8 以下的版本中相同的表达式计算为 true
.资源:https://www.php.net/manual/en/migration80.incompatible.php
归结起来,您的 if
和 elseif
表达式正在执行 truthy/falsey 检查。
- 如前所述,首先执行三元表达式的松散比较分支。
- 如果
isset($_GET['id'])
为真,$product['valid2']
的值被计算为truthy/falsey。 - 如果
isset($_GET['id'])
为假,松散比较的值被评估为truthy/falsey。
在不熟悉你的项目的情况下,用下面的方式表达逻辑可能是直接的、正确的、可读的。
echo isset($_GET['id']) && $product['valid2'] == 1 ? 'Yes' : 'No';
这并不是为了复制您的代码逻辑,而是为了改进它并确保您始终收到 yes/no 结果。