我正在做一些关于cakephp的自学(版本1.26) 我有一个简单的HTML输入文本字段,如下所示:
<input type="text" name="data[testing][name]" id="data[testing][name]">
根据数据库检查“输入”文本框字段中的值 如果值与数据库中存储的数据匹配,则返回true 这是代码:
{
$t=$this->data;
$result=$this->User->findByname($t['testing']['name']);
if($result){ //doing something;}
}
当我稍微修改上面的代码时,我遇到了一个问题 但后来它失败了:
{
$t=$this->data;
$result=$this->User->findByname($t['testing']['name']);
if($result===true){ //doing something;}
}
有人可以帮忙吗?
答案 0 :(得分:7)
您使用 严格 类型与===
而不是==
进行比较,这意味着$result
实际上不等于true
使条件失败。试着看看$result
变量中出现了什么:
var_dump($result);
或者使用(==
)尝试此条件:
if($result == true){ //doing something;}
或者简单地说:
if ($this->User->findByname($t['testing']['name'])){ //doing something;}
答案 1 :(得分:3)
假设findByName返回某种对象或数组。如果你使用if ($result)
,这个对象/数组将被强制转换为布尔值。
但是,如果您使用if ($result === true)
,则严格将对象/数组与布尔值true
进行比较,此比较将始终评估为false。
答案 2 :(得分:2)
PHP参考有关如何进行类型比较的非常好的解释。快速的答案是,你现在正在做一个更严格的比较,并且一些边缘情况正在崩溃。你可能会对$ result == true
没问题答案 3 :(得分:1)
这是因为$result === true
检查$result
值是true
。
但是您的$result
变量包含数据库的结果。
答案 4 :(得分:1)
粗略地,if
运算符casts将您的参数转换为布尔值并对其进行求值。因此if($result)
会将$result
转换为true
或false
。另一方面,===
实际上检查类型和“值”相等,因此如果true === $val
是布尔true
,$val
将仅返回true
。 ===
显然会返回一个布尔值,因此if
中的后续评估不需要强制转换。这对您来说意味着if($result)
会在$result
投射到true
时处理阻止。成为true
的内容的示例包括1
,'1'
和new Object()
。相反,if($result===true)
不会立即投放$result
。它在类型和“值”中检查它对布尔true
。
如果$result
是1
,那么前一个控制结构将处理该块,但后者不会。
答案 5 :(得分:1)
===意味着相同和相同的类型...... 但是$ result包含来自db的数据。所以它不是布尔... 使用==代替:
if($result==true)
答案 6 :(得分:1)
在您的代码中,当有结果时,返回值为非零,因此它将评估为true
。
===是身份运算符,当两个对象相同时将返回true
e.g。 1===1 (true) true===true (true) true===1
( false )
==是等于运算符,当两个对象相等或等效时,将返回true
。
e.g。 1==1 (true) true==true (true) true==1
( true )
findByName 将返回一个数组或unset
。 unset
将等同于false
,数组将等同于true
。
值true
本身永远不会在您的代码中返回,因此===永远不会是true
。