Cakephp if(某物)vs if(某物===真)
我在自学cakephp(1.26版)。Cakephp if(某物)vs if(某物===真),cakephp,cakephp-1.2,Cakephp,Cakephp 1.2,我在自学cakephp(1.26版)。 我得到了一个简单的HTML输入文本字段,如下所示: <input type="text" name="data[testing][name]" id="data[testing][name]"> 当我对上面的代码稍作修改时,遇到了一个问题, 但后来它失败了: { $t=$this->data; $result=$this->User->findByname($t['testing']['name']
我得到了一个简单的HTML输入文本字段,如下所示:
<input type="text" name="data[testing][name]" id="data[testing][name]">
当我对上面的代码稍作修改时,遇到了一个问题,但后来它失败了:
{
$t=$this->data;
$result=$this->User->findByname($t['testing']['name']);
if($result===true){ //doing something;}
}
有人能帮忙吗?您使用的是严格的类型比较==
,而不是=
,这意味着$result
实际上不等于true
,因为条件失败了。尝试查看$result
变量中的结果:
var_dump($result);
或者使用(=
)尝试此条件:
或者简单地说:
if ($this->User->findByname($t['testing']['name'])){ //doing something;}
这是因为
$result===true
检查$result
值是否为true
。
但是您的
$result
变量包含来自数据库的结果。这里假设findByName返回某种对象或数组。如果使用if($result)
此对象/数组将转换为布尔值
但是,如果您使用
If($result==true)
严格地将对象/数组与布尔值true
进行比较,则此比较的结果将始终为false。PHP参考文件对如何进行类型比较给出了非常好的解释。快速的答案是,您现在正在进行更严格的比较,一些边缘案例正在从裂缝中消失。如果$result==true,您可能不会有问题
粗略地说,
if
运算符将参数转换为布尔值并对其求值。因此,if($result)
将$result
转换为true
或false
。另一方面,===
实际上检查类型和“值”是否相等,因此true===$val
仅在$val
为布尔值true
时返回true
=
显然返回一个布尔值,因此在if
中后续求值不需要强制转换。这对您意味着,if($result)
处理块if$result
转换为true
。成为true
的示例有1
、'1'
和新对象()
。相反,如果($result==true)
不会立即强制转换$result
。它根据布尔值true
检查它的类型和“值”
如果
$result
为,例如1
,则前一个控制结构将处理该块,但后一个控制结构不会处理该块。===表示相等且与您相等的块类型相同。。。
但是$result包含来自db的数据..所以它不是布尔值。。。
使用==代替:
if($result==true)
在您的代码中,当有结果时,返回值非零,因此它将计算为
true
===是标识运算符,当两个对象相同时将返回true
e、 g.1===1(真)真===真(真)真===1
(false)
==是相等运算符,当两个对象相等或相等时,将返回true
e、 g.1==1(true)true==true(true)true==1
(true)
findByName将返回一个数组或unset
unset
将等同于false
,数组将等同于true
值
true
本身永远不会在代码中返回,因此===永远不会是true
顺便说一句,这个问题与CakePHP基本无关=
和if
都是本机PHP运算符。
if ($this->User->findByname($t['testing']['name'])){ //doing something;}
if($result==true)