DevOps开发运维
成长之路

PHP中的表达式与运算符

什么是表达式?

只要有值得东西都可以叫做表达式

PHP中的运算符

按照功能划分

1.算术运算符

+ - * / % **(幂运算)
<?php

//算术运算符的例子

$a = 3;
$b = 8;

echo $a+$b,'<br/>';
echo $a-$b,'<br/>';
echo $a*$b,'<br/>';
echo $a/$b,'<br/>';
echo 3%8,'<br/>';//3
echo 3%-8,'<br/>';//3
echo -3%8,'<br/>';//-3
echo -3%-8,'<br/>';//-3
echo 2 ** 3,'<br/>';
echo 3 ** 3;

2.递增递减运算符

1.++ --
2.前缀形式
  $var=1, ++$var,--$var
  先加减1,接着再执行
3.后缀形式
  $var=1;$var++;$var--;
  先执行,接着在加减1
4.注意
  数值型支持递增递减运算符
  布尔型不支持递增递减运算符
  NULL只支持递增不支持递减
  字符串只支持递增,不支持递减

dizengdijian.php

<?php

//递增递减运算符
//整数支持递增递减运算符

$i = 1;
echo ++$i,'<br/>';//2
$i = 5;
echo $i++,'<br/>';//5
echo $i,'<br/>';//6
$j = 3;
echo $j--,'<br/>';//3
echo $j,'<br/>';//2
$j = 5;
$j--;
echo $j,'<br/>';//4
echo '<hr/>';


//浮点类型支持递增递减运算符
$var = 1.2;
echo ++$var,'<br/>';//2.2
$var = 1.3;
echo --$var,'<br/>';//0.3
echo '<hr/>';

//布尔类型不支持递增递减运算符
$var=true;
echo $var,'<br/>';//1
echo ++$var,'<br/>';//1
echo --$var,'<br/>';//1
echo '<hr/>';

//测试null只支持递增运算符,不支持递减运算符
$var = null;
echo $var,'<br/>';//空
echo ++$var,'<br/>';//1
echo --$var,'<hr/>';//0

//测试字符串只支持递增运算符,不支持递减运算符
$str = 'a';
echo ++$str,'<br/>';//b
$str = 'c';
echo ++$str,'<br/>';//d
$str = 'm';
echo --$str,'<br/>';//m
$str = 'z';
echo ++$str,'<br/>';//aa
$str = 'a1';
echo ++$str,'<br/>';//a2
$str = 'a9';
echo ++$str,'<br/>';//b0
$str = 'B';
echo ++$str,'<br/>';//C

ord.php

<?php

//ord($ascii)得到指定字符的ASCII码值
$str = 'a';
echo ord($str),'<br/>';//97
echo ord(++$str),'<br/>';//98

//chr($ascii)根据指定字符得到对应的ASCII码值
echo chr(98),'<br/>';//b
echo chr(107),'<br/>';//k

3.字符连接符

英文的.来连接字符串
<?php

//字符连接符的例子

echo 'a'.'b'.'c'.'<br/>';

$str1 = 'hello';
$str2 = 'world';
$newStr = $str1.'~'.$str2.'!';
echo $newStr;//hello world

4.赋值运算符

1.=
2.+=
  $a+=1;$a=$a+1;
3.-=
  $a-=2;$a=$a-2;
4.*=
  $a*=3;$a=$a*3;
5./=
  $a/=4;$a=$a/4;
6.%=
  $a%=6;$a=$a%6;
7.=
  $str.='king';$str=$str.'king';

例子:

<?php

$username = 'king';
$i = 3;
$i +=5;
echo $i,'<br/>';//8
$i = 2;
$i -=5;
echo $i,'<br/>';//-3
$i = 3;
$i *=5;
echo $i,'<br/>';//15
$i = 6;
$i /=2;
echo $i,'<br/>';//3
$i = 3;
$i %=8;
echo $i;//3
echo '<br/>';
echo '<hr/>';
$str1 = 'hello';
$str1 .='world';
$str1 .='!';
echo $str1;//hello world

test.php

<?php

//mt_rand($min,$max)产生成一个随机数

echo mt_rand(1,9),'<br/>';
echo mt_rand(1000,9999),'<br/>';
echo '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1000,9999).'</span>';
echo '<hr/>';
echo '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
echo '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
echo '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
echo '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
echo '<hr/>';
$code = '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
$code .= '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
$code .= '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
$code .= '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.mt_rand(1,9).'</span>';
echo $code;

5.比较运算符

比较运算符的结果是布尔类型

==    只比较值是否相同
===    既要比较值,又要比较类型

bijiao.php

<?php

//比较运算符的例子
var_dump(
    3>2,
    2<4,
    3>=1,
    2<=4
);

//测试==和===
var_dump(
  1==true,
    1=='1',
    0==false,
    0==null,
    1===true,//false
    1==='1',//false
    0===false,//false
    1===1,
    1!=='1',
    1<>1,//false
    1!=='1'
);

//太空船运算符
var_dump(
  3<=>1,//1
  3<=>3,//0
  3<=>5//-1
);

var_dump(
  1.5<=>1.5,//0
  1.5<=>1.2,//1
  1.5<=>1.6  //-1
);

var_dump(
  'a'<=>a,//0
  'c'<=>b,//1
  'c'<=>'e'//-1
);

//NULL检测符
var_dump(
    true??'king'??123,//true
    0??false??null??'hello world',//0
    $abc??'hello world'//hello world
);

6.逻辑运算符

逻辑运算符的结果也是布尔类型

1.逻辑与
&&或者and代表逻辑与,是并且的意思,两个表达式都为true,结果才为true
  true && true=true
  true && false=false
  false && true=false
  false && false=false
  注意:
    如果第一个表达式为false,整个结果就为false,那第二个表达式就被短路(执行不到第二个表达式)

2.逻辑或
|| 或者 or代表逻辑或,是或者的意思,两个表达式有一个为true,结果就为true
  true || true=true
  true || false=true
  false || true=true
  false || false=false
  注意:
    如果第一个表达式为true,整个结果就为true,那第二个表达式就被短路了

3.逻辑非
!代表逻辑非,是取反
  !true=false
  !false=true

4.逻辑异或
xor代表逻辑异或,是两个表达式不同为true或者false结果为true
  true xor true=false
  true xor false=true
  false xor true=true
  false xor false=false

luoji.php

<?php

//测试逻辑运算符
//逻辑与
var_dump(
    true&&true,
    true&&false,
    false&&true,
    false&&false
);

//逻辑或
var_dump(
    true||true,
    true||false,
    false||true,
    false||false
);

//逻辑非
var_dump(
  !true,
  !false
);

//逻辑异或
var_dump(
  true xor true,
  true xor false,
  false xor true,
  false xor false
);
echo '<hr/>';

//逻辑与,短路
$i = 0;
$j = 1;
if($i&&$j){//0->false,$j不执行
    echo 'aa';
}else{
    echo 'bb';
}//bb
echo '<br/>';

$i = 0;
$j = 1;
if($i && --$j){//0->false,--$j不执行
    echo 'cc';
}else{
    echo 'dd';
}//dd
echo '<br/>';
var_dump($i,$j);//int(0) int(1)

$i = 0;
$j = 0;
if(++$i && $j++){//1->true,0->false
    echo 'ee';
}else{
    echo 'ff';
}//ff
echo '<br/>';
var_dump($i,$j);//int(1) int(1)

echo '<hr/>';

//逻辑或短路
$i = 1;
$j = 1;
if($i-- || ++$j){//1->true,++$j不执行
    echo '!!!';
}else{
    echo '###';
}//!!!
echo '<br/>';
var_dump($i,$j);//int(0) int(1)

echo '<hr/>';
$i = 1;
$j = 0;
var_dump(
  !0,
  ++$abcdefg && --$alksdjk,
  --$i || --$j
);
//true
//false
//true

7.错误抑制符

抑制错误输出,通过@符号加到会产生错误的表达式之前

按照运算符的数目

一元运算符  !
二元运算符  + - 
三元运算符
exp1?exp2:exp3
如果exp1为true,执行?之后的exp2,否则执行:之后exp3

sanyuan.php

<?php

//测试三元运算符
//三元运算符相当于缩写的if..else
if(true){
    echo 'aa';
}else{
    echo 'bb';
}

echo '<br/>';
echo true?'aa':'bb';
echo '<br/>';
$username = 'king';
if($username=='king'){
    $res='hello king';
}else{
    $res='hello everybody';
}
echo $res;
echo '<br/>';
$res=$username=='king'?'hello king':'hello everybody';
echo $res;
echo '<hr/>';
//exp1?:exp3

$res=123?:'abc';
$res=0?:'this is a test';
var_dump($res);
echo '<hr/>';

PHP运算符的优先级

想改变优先级可以通过()
有短路的情况优先考虑短路

youxianji.php

<?php

//(1+2)*3-4/5
//优先级的例子

$i = 1;
$j = 0;
if($i-- || $j++){//$i-- ->1->true,$j++不执行
    echo 'aa';
}else{
    echo 'bb';
}//aa
echo '<br/>';
var_dump($i,$j);//0 0
echo '<br/>';

$i = 1;
$j = 0;
if($p = $i-- || $j++){//$i-- ->1->true,$j++不执行
    echo 'aa';
}else{
    echo 'bb';
}//aa
echo '<br/>';
var_dump($i,$j,$p);//0 0 true

echo '<hr/>';

$i = 3;
$j = 8;
//拼装形式为3+8=11
echo "{$i}+{$j}=".$i+$j;//"3+8=3"+8=11
echo '<br/>';
echo "{$i}+{$j}=".($i+$j);//3+8=11

echo和var_dump

echo '<hr/>';
echo 1?true:false;echo '<br/>';//1
echo true?true:false;echo '<br/>';//1
var_dump(false?0:1);echo '<br/>';//int(1)
var_dump(true?true:false);//bool(true)
赞(1)

评论 抢沙发

评论前必须登录!

 

LNMP社群 不仅仅是技术

关于我们网站地图