php的基础语法[2]

运算符

算术运算符

这里无非说的是加(+)、减(-)、乘(*)、除(/)、模(%),

$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)


赋值运算符

这里第一反应肯定是 等于号(=),每个赋值运算符中都有等于号参与组成:

此表格中部分内容来源于菜鸟教程
这里的xyab均代表以$开头的变量,后面的几个表格同此。

运算符等同于描述
x = yx = y左操作数(x)被设置为右侧表达式的值(y)
a += ba = a + ba + b的值赋值给a
x -= yx = x - yx - y的值赋值给x
a *= ba = a * ba * b的值赋值给a
x /= yx = x / yx / y的值赋值给x
a %= ba = a % ba % b的值赋值给a
x .= yx = x . y连接两个字符串后(xy),赋值给x

这里需要注意的是,赋值对象,即等于号左侧的x/a不能为常量,必须是变量


递增/递减运算符

运算符名称描述
++x预递增x 加 1,然后返回 x
x++后递增返回 x,然后 x 加 1
--x预递减x 减 1,然后返回 x
x--后递减返回 x,然后 x 减 1

这里只举例++xx++--是类似的。

与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 <=> 00
null <=> true-1

不同的运算符之间肯定是有优先级的存在,但这么多关系,不可能一个个全记过去,所以最好的办法当然是在运算符之间加括号分开,而且这样也在一定程度上提高了代码的可读性。
比如:

echo 1 + 2 * 10, PHP_EOL;
echo (1 + 2) * 10, PHP_EOL;

这个地方是参考其他地方的,但我也只记得加减乘除的优先级关系了。

即使数学不怎么好的同学,
也一定知道第一行先算2 * 10+1等于21
第二行先算1 + 2* 10等于30,这就是括号的作用,这其实和数学课说的是一模一样的。

刚刚,怀疑狗生的我偷偷拿起了PHP跑了下,还好没毛病。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值