我被告知优秀的开发者可以识别并利用 Null
、False
、0
和其他好的 "空值" 实体之间的区别。在 PHP 中具体有什么区别?这与 ===
有关吗?
我被告知优秀的开发者可以识别并利用 Null
、False
、0
和其他好的 "空值" 实体之间的区别。在 PHP 中具体有什么区别?这与 ===
有关吗?
Null
表示 "无任何值",这个变量还没有被初始化。
False
表示 "在布尔运算环境下为假",用于明确表达你正在处理逻辑问题。
0
是一个 int
类型,与上述两个不同,用于数学计算。
动态语言(如 PHP)中的所有类型都有一个布尔值,即为 False。
如果你使用==
进行测试,则会测试布尔值,因此会得到相等的结果。如果你使用===
进行测试,则会测试类型,因此会得到不等的结果。
看一下strrpos()
函数。如果没有找到任何内容,则返回 False,但是如果找到了字符串的开头,则返回 0!
<?php
// pitfall :
if (strrpos("Hello World", "Hello")) {
// never exectuted
}
// smart move :
if (strrpos("Hello World", "Hello") !== False) {
// that works !
}
?>
当然,如果你处理状态:
你需要区分DebugMode = False
(关闭),DebugMode = True
(开启)和DebugMode = Null
(根本没有设置,将导致难以调试)。
null
就是 null
。false
就是 false
。虽然 PHP 设计上希望更加一致(在这里的精选答案中有概述),但实际情况并不如此,特别是当考虑到一些方法返回的 false
/null
的时候会变得很混乱(不易理解)。一些方法会用 null
而已经使用了 false
,例如 filter_input()。如果变量未通过过滤,则它们返回 false,如果变量不存在,则返回 null (不存在是否也意味着未通过过滤?)。 当作者关心失败类型时,方法可以交替返回 false/null/string 等,例如,在 filter_input()
中,如果您关心验证失败的原因,则可以检查 ===false
或 ===null
。但是,如果您没有注意到,这可能是一个陷阱,因为如果他们只记得编写 ===false
的测试用例,则可能会忘记添加对 ===null
的检查。大多数 php 单元测试/覆盖工具都不会提醒您缺少、未经测试的代码路径!最后,这里有一些有趣的类型转换,甚至不包括数组或对象。
var_dump( 0<0 ); #bool(false)
var_dump( 1<0 ); #bool(false)
var_dump( -1<0 ); #bool(true)
var_dump( false<0 ); #bool(false)
var_dump( null<0 ); #bool(false)
var_dump( ''<0 ); #bool(false)
var_dump( 'a'<0 ); #bool(false)
echo "\n";
var_dump( !0 ); #bool(true)
var_dump( !1 ); #bool(false)
var_dump( !-1 ); #bool(false)
var_dump( !false ); #bool(true)
var_dump( !null ); #bool(true)
var_dump( !'' ); #bool(true)
var_dump( !'a' ); #bool(false)
echo "\n";
var_dump( false == 0 ); #bool(true)
var_dump( false == 1 ); #bool(false)
var_dump( false == -1 ); #bool(false)
var_dump( false == false ); #bool(true)
var_dump( false == null ); #bool(true)
var_dump( false == '' ); #bool(true)
var_dump( false == 'a' ); #bool(false)
echo "\n";
var_dump( null == 0 ); #bool(true)
var_dump( null == 1 ); #bool(false)
var_dump( null == -1 ); #bool(false)
var_dump( null == false ); #bool(true)
var_dump( null == null ); #bool(true)
var_dump( null == '' ); #bool(true)
var_dump( null == 'a' ); #bool(false)
echo "\n";
$a=0; var_dump( empty($a) ); #bool(true)
$a=1; var_dump( empty($a) ); #bool(false)
$a=-1; var_dump( empty($a) ); #bool(false)
$a=false; var_dump( empty($a) ); #bool(true)
$a=null; var_dump( empty($a) ); #bool(true)
$a=''; var_dump( empty($a) ); #bool(true)
$a='a'; var_dump( empty($a)); # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( null == 0 );
开头的代码部分。 - Sparky0 == null
和 null == []
,但是 [] != 0
!! - nawfalstrrpos('fail', 'search')
返回 false
而不是 null
是正确的。如果 null
表示未知,则 strrpos
返回 null
就像它在说“我不知道字符串是否存在”而不是“字符串不存在”。 - Eborbob以下是一个示例:
Comparisons of $x with PHP functions
Expression gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null; NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE
请参考PHP类型比较,这将使您更加清楚地了解。
0 == false
是 true
,但是 0 === false
是 false
。同样的,!= 与 !== 也是如此。如果你使用上述运算符将 null 与其他两个值进行比较,结果也会类似。false
,并且必须使用恒等运算符 ===
检查这些情况。例如,如果你正在搜索一个字符串在另一个字符串中的位置,并且你正在使用 strpos()
,这个函数将返回数字位置,如果字符串位于开头,位置可能为 0,但如果根本没有找到字符串,则 strpos()
将返回 false
,在处理结果时必须考虑到这一点。False, Null, Nothing, 0, Undefined,等等。
每个关键词或值都有特定含义与实际概念相关,有时一个单词或值会承担多重含义。
在C和C++中,NULL
、False
和0
被重载为同一值。在C#中,它们是三种不同的概念。
null
或NULL
通常表示缺少值,但通常并不指明原因。0
表示自然数零,与1、2、3等类型等效,并且在支持单独概念的语言中应仅视为一个数字。
False表示非真。它用于二进制值。它并不意味着未设置,也不意味着0
。它只是表示两个二进制值之一。
Nothing可以表示特别设置为空值,这与null相同,但具有明确的意图。
在某些语言中,Undefined表示尚未设置该值,因为没有代码指定实际值。
我刚刚浪费了半天的时间,试图让 strops
返回 0
、null
或者 false
!
这是我一直在尝试做的事情,在我发现逻辑方向不对之前,似乎 php 代码中有一个黑洞:
概念 获取托管在服务器上的域名,并确保它不是根级别。虽然有几种不同的方法可以实现这个目标,但由于我已经使用过其他 PHP 函数/结构,所以我选择了另一种方式。
无论如何,以下是编程的基础:
if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ())
{
do this
} else {
or that
}
{
echo strpos(mydomain.co.uk, mydomain);
if ( strpos(mydomain, xmas) == null )
{
echo "\n1 is null";
}
if ( (strpos(mydomain.co.uk, mydomain)) == 0 )
{
echo "\n2 is 0";
} else {
echo "\n2 Something is WRONG";
}
if ( (mydomain.co.uk, mydomain)) != 0 )
{
echo "\n3 is 0";
} else {
echo "\n3 it is not 0";
}
if ( (mydomain.co.uk, mydomain)) == null )
{
echo "\n4 is null";
} else {
echo "\n4 Something is WRONG";
}
}
终于,在阅读这个主题后,我发现这个方法可行!!!
{
if ((mydomain.co.uk, mydomain)) !== false )
{
echo "\n5 is True";
} else {
echo "\n5 is False";
}
}
true
,因为它也可能是一个null
的日子!False
、NULL
和0
都不同于True或False或NULL
?根据PHP在线文档:
要将一个值显式转换为布尔值,请使用(bool)或(boolean)强制转换。
然而,在大多数情况下,类型转换是不必要的,因为如果运算符、函数或控制结构需要布尔参数,则会自动转换值。
在转换为布尔值时,以下值被视为FALSE:
FALSE
本身0.0
"0"
NULL
(包括未设置的变量)TRUE
(包括任何资源)。因此,在大多数情况下,它们是相同的。
另一方面,===
和==
不是相同的。通常,你只需要“等于”运算符。为了澄清:
$a == $b //Equal. TRUE if $a is equal to $b.
$a === $b //Identical. TRUE if $a is equal to $b, and they are of the same type.
如需更多信息,请查看PHP在线文档中的“比较运算符”页面。
希望这可以帮助您。
在数据库中,Null用于表示“没有记录”或“没有信息”。因此,您可能会有一个位字段,描述“这个用户是否想通过我们发送电子邮件”,其中True表示他们想要,False表示他们不想收到任何东西,但是Null表示您不知道。它们可以通过外部连接等方式产生。
Null的逻辑含义通常是不同的-在某些语言中,NULL不等于任何东西,因此if(a == NULL)将始终为false。
所以个人认为我总是将布尔值初始化为FALSE,并且将其初始化为NULL看起来有点奇怪(即使在C中两者都只是0...只是一种风格问题)。
在PHP中,这取决于您是否验证类型:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
从技术上讲,null 是 0x00
,但在 PHP 中,( null == 0x00 ) && ( null !== 0x00 )
。
0
是一个整数值。