Php 理解三元错误

Php 理解三元错误,php,ternary-operator,Php,Ternary Operator,三元谬误似乎没有关联。在这个例子中它是如何工作的 PHP初学者在这里,我有一个小程序,要求一个基数,并返回一个立方结果。我最初使用if/else编写它,但会得到“unnamed index”错误,但通过使用isset()解决了这个问题。下一个问题是传递给pow()的变量的“非数值”。我得到了使用下面三元的输入,现在它可以工作了 <?php $base = (int) (isset($_POST['base']) ? $_POST['base'] : 0);

三元谬误似乎没有关联。在这个例子中它是如何工作的

PHP初学者在这里,我有一个小程序,要求一个基数,并返回一个立方结果。我最初使用if/else编写它,但会得到“unnamed index”错误,但通过使用isset()解决了这个问题。下一个问题是传递给pow()的变量的“非数值”。我得到了使用下面三元的输入,现在它可以工作了


    <?php

    $base = (int) (isset($_POST['base']) ? $_POST['base'] : 0); 

    if ($base) {
        echo number_format(pow($base, 3));
    }
    else {
        echo 'Please enter a number';
    }

    ?>


我正在寻找一个解释,说明在之后false是如何工作的。它似乎并不重要——字符串、int等。我首先假设,通过0,它将false传递给下面的if/else,从而响应else语句。 接下来,我发现只需使用@Mark Locklear建议的
(是数字(($\u POST['base']))
在if语句中是我最初寻找的。沿着三元路径走会让我误入歧途,但肯定是一次学习经历。因此,该语句不会完全解决我最初的问题。 首先谢谢你

(isset($_POST['base']) ? $_POST['base'] : 0)
如果键
base
存在,则计算为
$\u POST['base']
,否则计算为
0

然后

$base = (int) (isset($_POST['base']) ? $_POST['base'] : 0);
…将结果强制转换为
int

如果用户输入非数字字符串(例如
ABC
)或传递空字符串,则
$base
设置为
0

最后

if ($base) {
$base
强制转换为布尔值。与
0
不同的任何数字将被计算为
true
0
将被计算为
false
并导致执行
else


任何与
0
不同的输入数字都将被立方化


没有输入,非数字字符串或值
0
将导致
请输入一个数字

PHP是松散类型的。这基本上意味着任何变量都可以随时更改其类型。您可以使用
$base='zero';
这意味着它是一个字符串,然后在下一行使用
$base=0;
,PHP也不会在意

从某种意义上讲,您是正确的,0等同于false,PHP将其解析为false,但严格来说,
0
是一个整数。如果您想将一个条件标记为布尔false,为了让代码更清晰,您应该使用
false
而不是
0


在处理
If
条件时,
false
0
null
都将解析为
false

这是按照您的预期进行的-基本上是说If
$\u POST['base']
未设置,然后将false放入
$base
,这意味着他们没有输入数字-因此代码将执行
回显“请输入一个数字”;
@NigelRen,这是不正确的。他将整数0放入$base,这相当于false,但并不完全相同。如果他想让0为false,他应该将
false
替换为
0
,这样他的意图就很清楚了。
Null
也会更清楚。@JonathanEltgroth,这就是为什么我将false设置为false。老实说,我不会这样写代码-但我试图解释他们的代码在做什么。如果你不理解某些东西,试着简化和构建。一个简单的开始可能是
,然后从命令行或IDE运行。然后添加一点,可能是
并观察,然后再添加一点
,然后可能是从您的web脚本执行
var\u dump($\u POST);
var\u dump(isset($\u POST['base']))
并且你可以理解这一切是如何结合在一起的。@Paolo和@Jonathan Eltgroth的可能复制品非常感谢你的回答。像这样分解它会让事情变得更清楚。为什么我可以将
:0);
值更改为基本上任何东西并且仍然有效?
后面的值似乎只是一个占位符或者指向
else
块的指针?@piagetblix,将ternaries视为简化的if/else语句。它不是指向任何其他代码块的指针。您说的是
如果该值存在,请将该值保存到$base,否则将0保存到$base
。然后,您说的是
如果($base的计算结果为true)执行此操作,否则执行其他操作。
因此
后面的部分与条件函数的相关性较小,但应清楚地反映其用途,如您在上面“处理If条件时,false、0、null和“”都将解析为false”。“它只是测试是否有一个值传递给
$base
如果没有,请将它作为
0
传递给第二个if/else…希望我说得清楚。@Jonathan Eltgroth抱歉在上面的评论中忘了提到你的名字-这是对你上一次评论的回应。”。thanks@piagetblix,差不多是这样。第一个表达式表示,
$base等于$\u POST['base']的值,否则$base的值为0
。然后,您只需检查$base的值(或状态)是否解析为true。另一种看待if-conditional的方法是,
if($base!=0){运行此代码}或者{运行此其他代码}
@Paolo您声明“如果用户输入一个非数字字符串(例如ABC)或者传递一个空字符串,那么$base被设置为0”,但是如果我在
var\u dump()时将`:0`更改为其他数字或字符串”
在该行之后,如果为false,则不返回该位置的内容(返回0)。因此,代码中的
0
不相关?@piagetblix如果用户输入非数字或空字符串,三元运算符的第一个表达式将计算为TRUE,因此冒号后面的内容:不相关。在这种情况下,由于隐式转换为整数,$base被设置为0。这一节“…由于隐式转换为整数而被设置为0。”帮助很大!干杯