PHP笔记 运算符篇

简介:PHP运算符学习笔记


1.基本规则

如果运算符优先级相同,则由运算符的结合方向决定如何运算。没有结合方向的同优先级运算符不能连在一起使用。即使在没有必要的情况下,最好也使用括号明确运算的顺序。

具体运算符的优先级参照http://php.net/manual/zh/language.operators.precedence.php

2.结合方向的理解

“左结合性”意味表达式的运算方向为从左向右,“右结合性”则相反。例如:已知“=”是右结合性的,那么表达式“$x = $y = $z;”的运算顺序是先执行“$y = $z;”,由上一篇笔记可知,这个赋值语句的值是$z;此后执行“$x = ($y = $z);”,即“$x = $z;”,完成整个赋值语句,最终结果为“$x = $z;$y = $z”。虽然结果很好理解,但过程并不直接。

3.取模(%)运算中的注意点

在进行取模运算前,运算的数都会被去除小数点后的数值,变为整数。

取模运算结果的正负号与被除数的正负号相同。

4.类似“$a += 3;”这样的加法运算表达式,字符串也有这样的表达式“.=”

$b = "Hello ";
$b .="world";    //输出结果为"Hello world",其等效为 $b = $b . "world";

5.位移操作在PHP中是数学操作,任何被移出的位都将被丢弃。左移时右侧将用0填充,意味着符号位不被保留;右移时左侧用符号位填充,意味着符号位可以得到保留。

6.没见过的几个比较运算符

太空船运算符(组合比较符):“<=>”,例如“$a <=> $b;”,当$a小于\等于\大于$b时返回一个小于\等于\大于0的整型数。

NULL合并操作符:“??”,例如“$a ?? $b ?? $c;”,返回从左到右的第一个不为NULL的操作数;若所有操作数为NULL,则返回NULL。

7.三元运算符的一个使用例(来自http://php.net/manual/zh/language.operators.comparison.php

<?php
// Example usage for: Ternary Operator
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// The above is identical to this if/else statement
if (empty($_POST['action'])) {
    $action = 'default';
} else {
    $action = $_POST['action'];
}

?>

三元运算符还可以进一步简化:代码“exp1 ?: exp2;”将在exp1为TRUE时返回exp1,否则返回exp2。此外,三元运算符是一个语句而不是变量,不可以对其进行引用操作。

不要将三元运算符堆积在一起使用。

8.仅对表达式有效的运算符“@”可以忽略掉此表达式出现的所有错误信息。(“如果能从某处得到值,就能在它前面加上@运算符。”)

9.关于递增\递减运算符

该运算符并不会影响布尔值。对NULL的递减操作没有效果,对NULL的递增的结果是整型数1.

<? php
@a = TRUE;     //结果应为TRUE
var_dump(++@a);
var_dump(@a++);

var_dump(--@a);
var_dump(@a--);

@b = FALSE;    //结果应为FALSE
var_dump(++@b);
var_dump(@b++);

var_dump(--@b);
var_dump(@b--);

@c = NULL;
var_dump(++@c);//结果应为整型数1
var_dump(@c++);//结果应为NULL(存疑)

var_dump(--@c);//这里的两个结果都将为NULL
var_dump(@c--);

@d = 'A'
@d++;          //结果为'AA',这是与C语言不同的地方
?>

一篇很有用的大神的文章:http://www.php.cn/php-weizijiaocheng-369859.html

10.逻辑运算符

与运算比或运算有更高的优先级,符号与(“&”)、符号或(“||”)比“and”、“or”有更高的优先级。“and”、“or”的优先级甚至比赋值用的“=”更低。因此有下面这个例子

<? php
$a = FALSE || TRUE;
//这个的结果是$a=TRUE

$b = FALSE and TRUE;
//这个的结果是$b=FALSE,因为“=”优先级更高,$b被先行赋值FALSE
?>

11.数组运算符中要注意的点

“$arr1 + $arr2;”中仅会用$arr2在$arr1中没有的键值对补充进$arr1中,键名相同的部分将保留$arr1中的值。

“!=”在两数组不等时为TRUE,“!==”则在不全等时为TRUE(这俩....似乎没区别?)

不等“!=”还可以写成“<>”

数组中“===”为TRUE的条件是键值对相等类型相同

12.类型运算符

instanceof用于检测一个变量是否属于某一个类\是否属于继承自某一个父类的某一个子类\是否实现了某一个接口的对象的实例;还可判断2个变量是否属于同一类。

注意别把它当成函数了...

如果被检测的变量不是对象,该运算不会提醒你而是仅仅返回FALSE。


疑问:

1.对new运算符的引用为什么会产生警告?

2.http://php.net/manual/zh/language.operators.comparison.php中涉及的字符串的比较似乎不完全符合字符串转数值的规则?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值