- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP 的比较运算与逻辑运算详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、以下值用 empty() 被判断为true:
未赋值变量、未声明变量、0、"0"、""、false、null、空数组 array() 、对象的魔术方法 __get() 返回的值 。
在低于 PHP5.0 的版本中,没有任何属性的对象也被 empty 判断为 true 。
注意:empty() 只接受变量或变量的索引值或属性值,不能直接传入常量,也不能传入运算表达式,PHP 5.5 之后支持表达式 。
2、被 isset() 判断为 false 的值:未赋值变量、未声明变量、null、__get() 返回的值,接受的参与 empty()一样,不能是常量和表达式. 。
3、不同类型的数据比较 。
如果有一个是 boolean 型或者 null, 转换成 boolean 比较.
否则如果有一个是 number,转换成 number 比较, 。
否则如果有一个是 string,转换成 string 比较 。
object 类型总是大于 array 类型和标量类型,array 类型总是大于 标量类型 。
注意这些比较结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//0开头的数字字符串转数字时不会按八进制转换,而是简单地丢弃把 '0' 丢弃按数字进行比较,
123==
'0123'
//true
"123"
<
"0124"
//true,0开头的数字字符串直接按十进制数字比较而非八进制
"012"
== 10
// false
== 10
// true
0x12 == 18
// true
"0x12"
== 18
// true
false
<
true
;
//true
2>
true
;
// false
2==
true
;
// true
null
==0;
//true
-1<0;
//true
-1<
null
;
//false ,-1 转 bool 是true
|
4、类型转换规则 。
被 empty() 判断为 true 的值转换为 boolean 型得到 false ,反之,得到 true ( __get() 返回的值需按具体的值判断) 。
被 empty() 判断为 true 的值转换成 number 得 0,非空的 array 转 number 得到1 ( __get() 返回的值需按具体的值判断) 。
1
2
3
4
5
6
7
8
9
10
11
|
class
Test{
private
$k
=1;
public
function
__get(
$propertyName
){
return
123;
}
}
$obj
=
new
Test();
echo
json_encode(
empty
(
$obj
->k));
//true
echo
json_encode(isset(
$obj
->k));
//false
echo
json_encode((bool)(
$obj
->k));
//true
|
几个string 转 number 的场景: 。
1
2
3
4
5
6
7
8
9
10
11
|
echo
'abc'
*1 ;
//0
echo
'012'
*1;
//12 乘法:可以转换十六进制数,不是数字开头则返回 0
echo
'0x12.123'
*1;
//18
echo
(float)
'0x12'
;
//0
echo
(int)
'0x12'
;
//0 不能处理十六进制数
echo
(float)
'12abc'
;
//12 截取左侧字符串
echo
(float)
'abc'
;
// 0 不是数字返回0
is_numeric
(
'0x123'
);
//true 能识别十六进制数
is_numeric
(
'0x123.123'
);
//false 识别目标是整个字符串而非截取前面一部分
|
string 转 number 时截取左侧的数字字符串进行转换,如果没有则返回 0. 。
其他数据转字符串:
1
2
3
4
5
|
//几个转字符串的值(string)0 ; // "0"
(string)true;
// "1"
(string)false;
// ""
(string)null;
// ""
(string)
array
();
// "Array"
|
数组可以直接进行字符串拼接操作但不能进行数学运算. 。
object 类型转换成 boolean 总是 true, object 类型不能转换成 number 和 string ,因此也不能进行字符串拼接和数学运算 。
标量转换成 array 的方式是将数组第一个元素设置成标量,返回该数组.
标量转换成 object 得到一个 stdClass 类的实例,标量的值被赋给名为 scalar 的属性: Object( [scalar] => 234) 。
array 转 object 得到一个 stdClass 类的实例,数组的 key 为实力的属性名.
object 转 array 有点复杂:
方法、静态属性、类常量被丢弃 。
保护属性名称前面被被加上一个 "*" 。
私有属性前面被加上类名作为前缀(大小写与类名完全相同) 。
这些前缀的前后都加上空字符 \0 。
例如一个由 object 转换来的 array 为:
Array( [*v] => 444 [bf] => 333 [bk] => 99977 [Ak] => 999 [*p] => 888 [a2] => 22) 。
原对象中有:
public 属性 a2, protected 属性 v、p ,这些属性来自哪个类无法鉴别(被重写则取子类的属性) 。
来自类 b 的 private 属性 f、k,(从数组 key 来看,以bf为例,无法判断他是属性名为bf,还是来自类b的私有属性f) 。
来自类 A 的 private 属性 k 。
无法鉴别 b 和 A 哪个是子类哪个是父类(仅从 array 的key来看,也无法推断出原对象构造自哪个类) 。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
A {
private
$A
=
'private property, $A of class A'
;
// This will become '\0A\0A'
protected
$C
=
'protected property, $C of class A'
;
}
class
B
extends
A {
private
$A
=
'private property, $A of class B'
;
// This will become '\0B\0A'
public
$AA
=
'public property, $AA of class B'
;
// This will become 'AA'
protected
$B
=
'protected property, $B of class B'
;
}
$arr
= (
array
)
new
B();
foreach
(
$arr
as
$key
=>
$value
) {
echo
'<br />'
;
echo
$key
.
',length: '
.
strlen
(
$key
).
' value: '
.
$value
;
}
|
输出结果:
1
2
3
4
5
|
BA,length: 4 value:
private
property,
$A
of
class
B
AA,length: 2 value:
public
property,
$AA
of
class
B
*B,length: 4 value:
protected
property,
$B
of
class
B
AA,length: 4 value:
private
property,
$A
of
class
A
*C,length: 4 value:
protected
property,
$C
of
class
A
|
5、 逻辑运算总是返回 true 或 false (写多了 javascript 的人要注意),逻辑运算符优先级从高到低 为 &&、 ||、 and、 or ,逻辑运算符的短路效果可以使用语句中,但记住他们不会像 javascript 中那样返回一个 不是 boolean 类型的值,在表达式中使用要注意.
。
1
2
3
4
5
6
|
$a
= 1;
$b
=0;
$b
and
$a
= 100;
echo
$a
;
//1
$b
||
$a
= 200;
echo
$a
;
//200
|
6、switch 的比较不是 "===" 而是 "==" (在 javascript 中是 "===") 。
7、 在 php4 中,object 之间的比较方式与 array 相同,在 php5 中 , object 类型间的 "==" 比较为 true的前 提是,他们属于同一个类的实例(当然还要进行属性的比较,这类似标量的"==="比较),object 间的 "===" 比较为 true 的前提是他 们 就是同一个对象.
在 PHP4 中 ,不包括任何成员变量的对象 被 empty() 判断为 true 。
字符串偏移 offset 取字符的 empty() 判定: 取对应 offset 的字符进行判断,在PHP5.4 以前,使用索引从字符串中取字符时会先将索引进行取整,因此左侧不包含数字的字符串都被转换成0,PHP5.4之后,不再对非整形格式的字符串索引进行取整,因此判断为 true, 同理,isset() 判定为false. 如:
1
2
3
4
5
6
7
8
|
$str
=
'ab0d'
;
empty
(
$str
[0]);
//false
empty
(
$str
[0.5]);
//false 索引被向下取整 为 0
empty
(
$str
[
"0.5"
]);
//false 索引被向下取整 为 0,PHP5.4之后不取证,判定为 true
empty
(
$str
[2]);
//true ,取得的字符为 "0"
empty
(
$str
[
"3"
]);
//false ,取得的字符为 "d"
empty
(
$str
[4]);
//true ,索引超出范围,notice 警告,但 empty() 会忽略警告
empty
(
$str
[
'a'
]);
// false ,左侧不包含数字字符串索引 PHP5.4之前被处理为 $str[0],PHP5.4之后,直接为判定 true
|
无论是“不等于”还是”==“ ,不要在 PHP 的跨类型数据比较中使用”传递性“:
$a == $b; //true 。
$b == $c; //true 。
并不能说明 $a == $c 为 true 。
数组的比较方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// 数组是用标准比较运算符这样比较的
function
standard_array_compare(
$op1
,
$op2
)
{
if
(
count
(
$op1
) <
count
(
$op2
)) {
return
-1;
// $op1 < $op2
}
elseif
(
count
(
$op1
) >
count
(
$op2
)) {
return
1;
// $op1 > $op2
}
foreach
(
$op1
as
$key
=>
$val
) {
if
(!
array_key_exists
(
$key
,
$op2
)) {
return
null;
// uncomparable
}
elseif
(
$val
<
$op2
[
$key
]) {
return
-1;
}
elseif
(
$val
>
$op2
[
$key
]) {
return
1;
}
}
return
0;
// $op1 == $op2
}
|
8、三元运算符: 跟其他大多数编程语言不一样,PHP 的三元运算符是左结合的! 。
1
2
3
4
5
6
7
8
|
$arg
=
'T'
;
$vehicle
= ( (
$arg
==
'B'
) ?
'bus'
:
(
$arg
==
'A'
) ?
'airplane'
:
(
$arg
==
'T'
) ?
'train'
:
(
$arg
==
'C'
) ?
'car'
:
(
$arg
==
'H'
) ?
'horse'
:
'feet'
);
echo
$vehicle
;
//horse
|
三元运算表达式被划分为 。
1
2
3
4
5
|
(
$arg
==
'B'
) ?
'bus'
: (
$arg
==
'A'
)
?
'airplane'
: (
$arg
==
'T'
)
?
'train'
: (
$arg
==
'C'
)
?
'car'
: (
$arg
==
'H'
)
?
'horse'
:
'feet'
;
|
以上这篇PHP 的比较运算与逻辑运算详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于PHP 的比较运算与逻辑运算详解的文章就讲到这里了,如果你想了解更多关于PHP 的比较运算与逻辑运算详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想使用 NetworkX Graph 对象作为 Python dict 中的键。但是,我不希望默认的比较行为(即通过对象的地址)。相反,我希望同构图是 dict 中相同元素的键。 此行为是否已在某处
这个问题已经有答案了: What is the most effective way for float and double comparison? (33 个回答) 已关闭 7 年前。 在您认为我
我正在学习 C 编程,为了练习,我找到了一个需要解决的任务。这有点像一个游戏,有人选择一个单词,其他人猜测字母。我必须检查有多少给定的单词可能是所选单词的正确答案。 输入: 3 3//数字 n 和 m
我两天前开始学习C,在做作业时遇到了问题。我们的目的是从字符数组中获取字符列表,并通过计算连续字符并将其替换为数字来缩短它。对“a4b5c5”说“aaaabbbbbccccc”。这是我到目前为止的代码
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
为什么我在 if 中的比较不起作用?答案应该是 8 但它返回 0。 function findMissing(missingArray){ var getArray = missing
我想知道为什么以下 JavaScript 比较会给出不同的结果。 (1==true==1) true (2==true==2) false (0==false==0) false (0==false)
我想知道是否有人可以帮助我完成这个程序。编写一个接受两个字符串的函数。该函数应该将这两个字符串与字典顺序上排在第一位的字符串组合起来。两个字符串之间应该有一个空格。在一行上打印结果字符串。在一行上打印
有谁知道一个免费的开源库(实用程序类),它允许您比较一个 Java bean 的两个实例并返回一个属性列表/数组,这两个实例的值不同?请发布一个小样本。 干杯 托马斯 最佳答案 BeanCompara
我是java新手。任何人都可以给出以下类声明的含义 public class ListNode, V> { K key; V value; ListNode next;
我需要用 C 语言计算和比较 3 种不同大小(100 * 100、1000 * 1000 和 10000 * 10000)的 2 个矩阵相乘的执行时间。我编写了以下简单代码来为 1000 * 1000
当我在 ACCESS 2007 中运行以下 SQL 时 Select Location, COUNT(ApartmentBuildings) AS TotalIBuildingsManaged Fro
根据我对互斥锁的了解——它们通常提供对共享资源的锁定功能。因此,如果一个新线程想要访问这个锁定的共享资源——它要么退出,要么必须不断轮询锁(并在等待锁时浪费处理器周期)。 但是,监视器具有条件变量,它
通常在编程中,不应该比较浮点数据类型是否相等,因为存储的值通常是近似值。 由于两个非整数 Oracle NUMBER 值的存储方式不同(以 10 为基数),是否可以可靠地比较它们是否相等? 最佳答案
使用 PowerShell 时,我们偶尔会比较不同类型的对象。一个常见的场景是 $int -eq $bool (即其中 0 -eq $false 、 0 -ne $true 和任何非零值仅等于真,但不
#include #define MAX 1000 void any(char s1[], char s2[], char s3[]); int main() { char string1[
我想比较两个日期。 从这两个日期中,我只使用 ToShortDateString() 获取日期组件, 如下所示。现在的问题是当我比较两个日期时。它的 throw 错误—— "Operator >= c
用户输入一个数字( float 或整数),并且它必须大于下限。 这是从 UITextField 获取数字的代码: NSNumberFormatter * f = [[NSNumberFormatter
我已经摆弄这段代码大约一个小时了,它让我难以置信。我认为解决方案相当简单,但我似乎无法弄清楚。无论如何,这里去。我制作了一个 javascript 函数来检查用户输入的字符,以便它只能接受 7 个字符
我不太明白为什么当我们在不覆盖 equals 的情况下比较具有相同类属性的两个实例时方法,它将给出 false .但它会给出 true当我们比较一个案例类的两个实例时。例如 class A(val
我是一名优秀的程序员,十分优秀!