运算符
算术运算符
这里无非说的是加(+
)、减(-
)、乘(*
)、除(/
)、模(%
),
$a = 10;
$b = 6;
var_dump($a + $b);
var_dump($a - $b);
var_dump($a * $b);
var_dump($a / $b);
var_dump($a % $b);
输出:
int(16)
int(4)
int(60)
float(1.6666666666667)
int(4)
上篇已经说过,
PHP的数值默认是用整数表示,当数值超出整数范围时,会自动转为更大范围的float
。
取反(-
)也是算术运算符,它放在数值前,用于取负数(相反数)。
$a = 99;
$b = -1024;
var_dump(-$a);
var_dump(-$b);
输出:
int(-99)
int(1024)
细心的你一定发现了,它的符号和减(-
)一样,但这并没有什么影响。
$a = 10;
$b = -9;
var_dump($a - -$b);
输出:int(1)
还有连接(.
),用于拼接两段文本成一个文本:
$a = "123";
$b = "456";
var_dump($a.$b);
输出:string(6) "123456"
如果用来连接两个数字呢?
$a = 666;
$b = 999;
var_dump($a.$b);
输出:string(6) "666999"
看样子,使用这个运算符时,非文本类型的数据会先被转换成文本,然后拼接。
同样的,当使用+
、-
、*
、/
、%
去计算两个字符串时,也有类似的效应。
$a = "123";
$b = "456";
var_dump($a + $b);
输出:int(579)
赋值运算符
这里第一反应肯定是 等于号(=
),每个赋值运算符中都有等于号参与组成:
此表格中部分内容来源于菜鸟教程
这里的x
、y
、a
、b
均代表以$
开头的变量,后面的几个表格同此。
运算符 | 等同于 | 描述 |
---|---|---|
x = y | x = y | 左操作数(x )被设置为右侧表达式的值(y ) |
a += b | a = a + b | 将a + b 的值赋值给a |
x -= y | x = x - y | 将x - y 的值赋值给x |
a *= b | a = a * b | 将a * b 的值赋值给a |
x /= y | x = x / y | 将x / y 的值赋值给x |
a %= b | a = a % b | 将a % b 的值赋值给a |
x .= y | x = x . y | 连接两个字符串后(x 和y ),赋值给x |
这里需要注意的是,赋值对象,即等于号左侧的x
/a
,不能为常量,必须是变量。
递增/递减运算符
运算符 | 名称 | 描述 |
---|---|---|
++x | 预递增 | x 加 1,然后返回 x |
x++ | 后递增 | 返回 x,然后 x 加 1 |
--x | 预递减 | x 减 1,然后返回 x |
x-- | 后递减 | 返回 x,然后 x 减 1 |
这里只举例++x
和x++
,--
是类似的。
与c语言相似,(复读 x N,啰嗦归啰嗦,但事实就是这样,毕竟php就是从c还是cpp发展而来,虽然语法什么的都快和java同化了)
$a = 1;
$b = -1;
var_dump($a++);
var_dump($a);
var_dump(++$b);
输出:
int(1)
int(2)
int(0)
可以看到,
使用x++
时,表面获取到并未第一时间发生改变,
而使用++x
时,表面获取到值是已经变化的(即加1)。
比较运算符
正如大家都知道的,有大于(>
)、大于等于(>=
)、小于(<
)、小于等于(<=
)、不等于(!=
/ <>
),还有等于(==
),php还是和那啥一样,等于使用两个等于号表示。
比较运算符用在两个变量之间,可以视为一种大小关系,
它的运算结果是逻辑值类型,即当关系成立时为true
要注意的是,当比较的变量为数组时,使用大于(>
)、大于等于(>=
)、小于(<
)、小于等于(<=
)这类比较运算符是无意义的,强行比较不会出错,但运算结果为false
。
但因为作为一门弱类型语言,php还引入了类型比较运算符:绝对等于(===
)和绝对不等于(!==
)
拿 「绝对等于」 来说,就是 在比较值的情况下还比较数据类型是否一致,(猜测应该是)先比较类型,当类型相同时才会比较值是否相同,两个条件都符合时,运算结果才是true
:
var_dump(123 == "123");
var_dump(123 === "123");
var_dump(123 !== "123");
输出:
bool(true)
bool(false)
bool(true)
逻辑运算符
常见的有:与(and
/ &&
)、或(or
/ ||
)、非(!
),还有一个异或(xor
)。
同样的,这些运算符不区分大小写,运算结果一样是逻辑型。
「与」是按条件顺序进行一一运算,
如果当前运算的条件不成立,则立即结束运算并返回false
;所有条件都成立时返回true
:
$a = 0;
$b = 1;
var_dump($a++ and $b++);
var_dump($a);
var_dump($b);
输出:
bool(false)
int(1)
int(1)
「或」也是按条件顺序进行一一运算,
如果当前运算的条件成立,则立即结束运算并返回true
,否则继续判断下个条件;当所有条件都不成立时返回false
:
- demo1:
$a = 0;
$b = 0;
var_dump(++$a or $b++);
var_dump($a);
var_dump($b);
输出:
bool(true)
int(1)
int(0)
- demo2:
$a = 0;
$b = 0;
var_dump($a++ or ++$b or $a++);
var_dump($a);
var_dump($b);
输出:
bool(true)
int(1)
int(1)
「非」就是对逻辑值进行取反操作,相当于判断变量是否等于false
,
因为逻辑值可以和其他数据类型相互转换,所以相当于可以用来判断变量是否为空值等操作:
$n = 0;
var_dump(!$n);
$n = 1;
var_dump(!$n); // 相当于判断$n == 0;
$s = "";
var_dump(!$s);
$s = "123";
var_dump(!$s); // 相当于判断$s == "";
输出:
bool(true)
bool(false)
bool(true)
bool(false)
三元运算符
属于一种条件运算符,具体语法是:条件 ? 条件成立时的返回结果 : 条件不成立时的返回结果;
$s = 'a';
echo $s != "" ? 1 : 0; // 当s不为空文本时结果为1,否则结果为0.
输出:1
返回结果只会根据条件成立与否进行选择计算:
$a = 0;
$b = 0;
$a == 0 ? ++$a : ++$b;
echo "\$a = $a ,\$b = $b";
也就是说,当$a == 0
成立时,才会执行++$a
,否则执行++$b
,而不是都执行,所以输出为:$a = 1 ,$b = 0
这里补充个注意点,
在双引号中使用变量时,变量名和其他文本之间必须用个空格间隔,否则会产生一个「找不到变量」的错误。
以上是所有PHP版本下通用的三元运算符用法,而在5.3和7后又有所不同。
php5.3中,可将「条件成立时的返回结果」直接省略,即条件 ? : 条件不成立时的返回结果;
,执行效果为:当条件成立时返回「条件值」,不成立时返回「条件不成立时的返回结果」。
$a = 0;
echo $a ?: 1, PHP_EOL;
$a = 10;
echo $a ?: 99, PHP_EOL;
在第一个echo
中,因为a
等于0,条件(a
不等于0
)不成立,所以输出1;
在第二个echo
中,因为a
等于10,条件成立,所以输出10,而不是99.
PHP_EOL也是换行符,可用于多系统平台。
而在php7下,又多了一种新语法:变量 ?? 变量未定义时的返回结果
$s = 0;
echo $s ?? 1, PHP_EOL;
unset($s); // 删除变量
echo $s ?: 's不存在', PHP_EOL;
- 当变量存在时,不论变量值转换成逻辑值后是否为
false
,都返回变量本身,所以输出0
。 - 因为变量在使用后不会被自动删除,所以这里用
unset
函数手动删除,
因此这时候就没有名为s
的变量,所以输出为s不存在
。
不仅如此,php7下还增加了一种组合比较符:$x <=> $y
不同的是,比较结果是整数型。因为形状相似,所以也叫太空船操作符。
var_dump("123" <=> "123");
var_dump(0 <=> 1);
var_dump(1 <=> 0);
- 当
x
等于y
时,比较结果为0
,所以"123" <=> "123"
的结果是0
; - 当
x
小于y
时,比较结果为-1
,即0 <=> 1
的结果为-1
; - 当
x
大于y
时,比较结果为1
,即1 <=> 0
的结果为1
;
从上面的代码中也可以看出,比较值可以是非数值类型,
当不同类型进行比较时,会被转换成相同类型进行比较,
比如 | 结果 |
---|---|
123 <=> "122" | 1 |
123 <=> "123" | 0 |
123 <=> "124" | -1 |
false <=> 0 | 0 |
null <=> true | -1 |
不同的运算符之间肯定是有优先级的存在,但这么多关系,不可能一个个全记过去,所以最好的办法当然是在运算符之间加括号分开,而且这样也在一定程度上提高了代码的可读性。
比如:
echo 1 + 2 * 10, PHP_EOL;
echo (1 + 2) * 10, PHP_EOL;
这个地方是参考其他地方的,但我也只记得加减乘除的优先级关系了。
即使数学不怎么好的同学,
也一定知道第一行先算2 * 10
再+1
等于21
,
第二行先算1 + 2
再* 10
等于30
,这就是括号的作用,这其实和数学课说的是一模一样的。
刚刚,怀疑狗生的我偷偷拿起了PHP跑了下,还好没毛病。