运算符可以通过一个或多个值来产生另一个值。
$a-$b:减法
$a*$b:乘法
$a/$b:除法,除法总是返回浮点数,除非两个操作数都为整数并且能整除。
$a%$b:取模,取模运算符的操作数在运算之前会转为整数(除去小数部分),结果和被除数($a)的正负号相同。
$a**$b:幂
-$a:取反
$a&$b:按位与,把$a和$b中都为1的位设为1。
$a|$b:按位或,把$a和$b中任何一个1的位设为1。
$a^$b:按位异或,把$a和$b中对应的位不同的位设为1。
~$a:把$a中为0的位设为1,为1的位设为0。
$a<<$b:把$a中的位向左移动$b次,每一次移动都表示乘以2。
$a>>$b:把$a中的位向右移动$b次,每一次移动都表示除以2。
在任何方向上移出去的位都会被丢弃,另一侧以零填充。
$a == $b:等于。如果类型转换后$a等于$b,返回true。
$a === $b:全等。如果$a等于$b,并且它们的类型也相同。
$a != $b :不等于。如果类型转换后$a不等于$b,返回true。
$a <> $b :不等于。如果类型转换后$a不等于$b,返回true。
$a !== $b:不全等。如果$a不等于$b,或者它们的类型不同,返回true。
$a < $b :小于。如果$a严格小于$b,返回true。
$a > $b :大于。如果$a严格大于$b,返回true。
$a <= $b :如果$a大于或等于$b,返回true。
$a >= $b :如果$a大于或等于$b,返回true。
$a <=> $b:组合比较符,PHP7起,$a小于、等于、大于$b时分别返回一个小于、等于、大于0的整数值。
$a ?? $b ?? $c:NULL合并操作符。PHP7起,返回从左往右起第一个存在且不为NULL的操作数。
expr1?expr2:expr3:三目运算符,如果expr1表达式为true,则值为expr2,expr1表达式为false,则值为expr3。
expr1?:expr3:PHP53.引入,三目运算符的简写,如果expr1表达式为true,则值为expr1,expr1表达式为false,则值为expr3。
如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会转换为数字,并按数字进行比较,switch语句也是如此。但是使用===或!==进行比较时不会进行转换,因为这两个比较会比较类型。使用三目运算符要注意尽量不要叠加在一起,以免造成混乱。另外由于浮点型的内部表达方式,不应比较两个浮点型是否相等。某些数学运算会产生一个由常量NAN所代表的结果,表示一个在浮点数运算中未定义或不可表示的值,用此值与任何除了true以外的值进行松散或严格比较的结果都是false。NAN也不能和其自身比较,如果要确定一个值是否是NAN,应该用is_nan()函数。当使用比较运算符(==)比较两个对象变量时,如果两个对象的属性和属性值都相等,并且两个对象是同一个类的实例,那么两个对象变量相等;而如果使用全等运算符(===),则只有当两个对象变量指向某个类的同一实例这两个对象变量才相等。
$a++:后加,返回$a,然后$a的值加1。
--$a:前减,$a的值减1,然后返回$a。
$a --:后减,返回$a,然后$a的值减1。
递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。 在处理字符变量的算数运算时,PHP沿袭了Perl的习惯,即“Z”递增后会变成AA,而不是“[”。字符变量只能递增,不能递减。
$a or $b:逻辑或,如果$a或$b任何一个为true,返回true。
$a xor $b:逻辑异或,如果$a或$b只有一个为true,返回true。
!$a:逻辑非,如果$a不为true,返回true。
$a&&$b:逻辑与,如果$a和$b都为true,返回true。
$a||$b:逻辑或,如果$a或$b任何一个为true,返回true。
其中逻辑与和逻辑或有两种表示形式,它们是有一点 区别的。
$a==$b:相等,如果$a和$b具有相同的键/值对则为true。
$a===$b:全等,如果$a和$b具有相同的键/值对并且顺序和类型都相同则为true。
$a!=$b:不等,如果$a不等于$b则为true。
$a<>$b:不等,如果$a不等于$b则为true。
$a!==$b:不全等,如果$a不全等于$b则为true。
算术运算符
$a+$b:加法$a-$b:减法
$a*$b:乘法
$a/$b:除法,除法总是返回浮点数,除非两个操作数都为整数并且能整除。
$a%$b:取模,取模运算符的操作数在运算之前会转为整数(除去小数部分),结果和被除数($a)的正负号相同。
$a**$b:幂
-$a:取反
赋值运算符
PHP中基础的赋值运算符是“=”,右侧的赋值表达式会为左侧设置值。除此之外,还适用于所有二元算术、数组集合和字符串运算符的“组合运算符”。赋值运算符是将原变量中的值拷贝到新变量中,改变其中一个并不影响另外一个,这种方式是传值赋值。还有一种赋值叫引用赋值,引用赋值意味着两个变量指向同一数据,没有拷贝任何东西。引用赋值通过“&”来表示,语法为“$a=&$b”,当对其中一个变量进行修改时,另一个变量也会相应的改变。要注意的是在PHP5中,在复制object对象时,如果没有明确使用clone关键字,那么就是引用赋值;new关键字会返回一个引用,如果对new的结果进行引用赋值,会发出一条E_STRICT 错误信息,PHP5.3起会发出一条E_DEPRECATED错误信息。
位运算符
位运算符允许对整数按二进制位进行求值和操作。$a&$b:按位与,把$a和$b中都为1的位设为1。
$a|$b:按位或,把$a和$b中任何一个1的位设为1。
$a^$b:按位异或,把$a和$b中对应的位不同的位设为1。
~$a:把$a中为0的位设为1,为1的位设为0。
$a<<$b:把$a中的位向左移动$b次,每一次移动都表示乘以2。
$a>>$b:把$a中的位向右移动$b次,每一次移动都表示除以2。
在任何方向上移出去的位都会被丢弃,另一侧以零填充。
比较运算符
比较运算符允许对两个值进行比较。$a == $b:等于。如果类型转换后$a等于$b,返回true。
$a === $b:全等。如果$a等于$b,并且它们的类型也相同。
$a != $b :不等于。如果类型转换后$a不等于$b,返回true。
$a <> $b :不等于。如果类型转换后$a不等于$b,返回true。
$a !== $b:不全等。如果$a不等于$b,或者它们的类型不同,返回true。
$a < $b :小于。如果$a严格小于$b,返回true。
$a > $b :大于。如果$a严格大于$b,返回true。
$a <= $b :如果$a大于或等于$b,返回true。
$a >= $b :如果$a大于或等于$b,返回true。
$a <=> $b:组合比较符,PHP7起,$a小于、等于、大于$b时分别返回一个小于、等于、大于0的整数值。
$a ?? $b ?? $c:NULL合并操作符。PHP7起,返回从左往右起第一个存在且不为NULL的操作数。
expr1?expr2:expr3:三目运算符,如果expr1表达式为true,则值为expr2,expr1表达式为false,则值为expr3。
expr1?:expr3:PHP53.引入,三目运算符的简写,如果expr1表达式为true,则值为expr1,expr1表达式为false,则值为expr3。
如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会转换为数字,并按数字进行比较,switch语句也是如此。但是使用===或!==进行比较时不会进行转换,因为这两个比较会比较类型。使用三目运算符要注意尽量不要叠加在一起,以免造成混乱。另外由于浮点型的内部表达方式,不应比较两个浮点型是否相等。某些数学运算会产生一个由常量NAN所代表的结果,表示一个在浮点数运算中未定义或不可表示的值,用此值与任何除了true以外的值进行松散或严格比较的结果都是false。NAN也不能和其自身比较,如果要确定一个值是否是NAN,应该用is_nan()函数。当使用比较运算符(==)比较两个对象变量时,如果两个对象的属性和属性值都相等,并且两个对象是同一个类的实例,那么两个对象变量相等;而如果使用全等运算符(===),则只有当两个对象变量指向某个类的同一实例这两个对象变量才相等。
错误控制运算符
将错误控制运算符@放置在一个PHP表达式之前,则该表达式可能产生的任何错误信息都会被忽略掉。如果用set_error_handler()设定了自定义的错误处理函数,则不会被忽略,但是在此处理函数中可以调用error_reporting(),该函数的作用是在出错语句前有@时返回0。如果激活了track_errors特性,表达式产生的任何错误信息都会被存放在$php_errormsg中,该变量在每次出错时都会被覆盖。@可以放在变量、函数和include调用,常量等之前,不能放在函数、类定义前,也不能用于条件结构。执行运算符
PHP会尝试将执行运算符(反引号)“``”中的内容作为shell命令来执行,并将其输出信息返回。使用执行运算符与调用函数shell_exec()的效果相同。在激活了安全模式或者关闭了shell_exec()时是无效的。执行运算符不能在双引号字符串中使用。递增/递减运算符
++$a:前加,$a的值加1,然后返回$a。$a++:后加,返回$a,然后$a的值加1。
--$a:前减,$a的值减1,然后返回$a。
$a --:后减,返回$a,然后$a的值减1。
递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。 在处理字符变量的算数运算时,PHP沿袭了Perl的习惯,即“Z”递增后会变成AA,而不是“[”。字符变量只能递增,不能递减。
逻辑运算符
$a and $b:逻辑与,如果$a和$b都为true,返回true。$a or $b:逻辑或,如果$a或$b任何一个为true,返回true。
$a xor $b:逻辑异或,如果$a或$b只有一个为true,返回true。
!$a:逻辑非,如果$a不为true,返回true。
$a&&$b:逻辑与,如果$a和$b都为true,返回true。
$a||$b:逻辑或,如果$a或$b任何一个为true,返回true。
其中逻辑与和逻辑或有两种表示形式,它们是有一点 区别的。
字符串运算符
字符串运算符“.”可以将两个运算符左右的字符串连接到一起后返回。还可以与赋值运算符“=”联合使用,做为连接赋值运算符,会将右边的参数值附加到左边的参数值之后赋值给左边的参数。数组运算符
$a+$b:联合,$a和$b的联合。$a==$b:相等,如果$a和$b具有相同的键/值对则为true。
$a===$b:全等,如果$a和$b具有相同的键/值对并且顺序和类型都相同则为true。
$a!=$b:不等,如果$a不等于$b则为true。
$a<>$b:不等,如果$a不等于$b则为true。
$a!==$b:不全等,如果$a不全等于$b则为true。
类型运算符
类型运算符“instanceof”用于确定一个PHP变量是否属于某一类的实例。也可以用来确定一个变量是否是继承自某一父类的子类实例,还可以用于确定一个变量是不是实现了某个接口。如果被检测的变量不是对象,instanceof 并不发出任何错误信息而是返回false。要注意的是instanceof不能用来检测常量。另外在PHP5.1之前,如果要检查的类名称不存在,instanceof会调用__autoload()。如果该类没有被装载则会产生一个致命错误。可以通过使用动态类引用或用一个包含类名的字符串变量来避开这种问题。
<?php
$a=5;
$b=3;
echo ($a+$b)."\n";//prints 8
echo ($a-$b)."\n"; // prints 2
echo ($a*$b."\n"); // prints 15
echo ($a/$b)."\n"; // prints 1.6666666666667
echo (-$a)."\n";//prints -5
echo ($a%$b)."\n"; // prints 2
echo ($a%-$b)."\n";// prints 2
echo (-$a%$b)."\n"; // prints -2
echo (-$a%-$b)."\n";// prints -2
$a+=$b;
echo ($a)."\n"; //prints 8
echo ($a&$b)."\n";//prints 0
echo ($a|$b)."\n";//prints 11
echo ($a^$b)."\n";//prints 11
echo (~$a)."\n";//prints -9
echo ($a<<$b)."\n";//prints 64
echo ($a>>$b)."\n";//prints 1
var_dump($a == $b);//bool(false)
var_dump($a === $b);//bool(false)
var_dump($a != $b);//bool(true)
var_dump($a <> $b);//bool(true)
var_dump($a !== $b);//bool(true)
var_dump($a < $b);//bool(false)
var_dump($a > $b);//bool(true)
var_dump($a <= $b);//bool(false)
var_dump($a >= $b);//bool(true)
echo($a <=> $b)."\n";//1
echo($c ?? $a ?? $b)."\n";//prints 8
(@include("file.php")) or print("Could not find file.php!\n");
$output = `ls -al`;
echo "$output";
echo "Should be 8: ". $a++ ."\n";
echo "Should be 9: ". $a ."\n";
echo "Should be 10: ". ++$a ."\n";
echo "Should be 10: ". $a ."\n";
echo "Should be 10: ". $a-- ."\n";
echo "Should be 9: ". $a ."\n";
echo "Should be 8: ". --$a ."\n";
echo "Should be 8: ". $a ."\n";
$d =true;
var_dump(++$d);//bool(true)
var_dump(--$d);//bool(true)
$c=NULL;
$c--;
var_dump($c);//NULL
--$c;
var_dump($c);//NULL
$c++;
var_dump($c);//int(1)
$c=NULL;
++$c;
var_dump($c);//int(1)
$d = 'Z';
echo ++$d."\n";//AA
echo --$d."\n";//AA
$d = 'A9';
echo ++$d."\n";//B0
$d = 'A09';
echo ++$d."\n";//A10
$c = (false && foo());
var_dump($c);//bool(false)
$c = (false and foo());
var_dump($c);//bool(false)
$c = (true || foo());
var_dump($c);//bool(true)
$c = (true or foo());
var_dump($c);//bool(true)
$array1 = array("one", "two");
$array2 = array(1 => "two", "0" => "one");
var_dump($array1 == $array2); // bool(true)
var_dump($array1 === $array2); // bool(false)
$array1 = array("0" => "one",1 => "two");
var_dump($array1 == $array2); // bool(true)
var_dump($array1 === $array2); // bool(false)
$array2 = array("0" => "one",1 => "two");
var_dump($array1 == $array2); // bool(true)
var_dump($array1 === $array2); // bool(true)
$array2 = array("one", "two","three");
var_dump($array1+$array2);
class Test{
}
class NotTest{
}
$test=new Test;
var_dump($test instanceof Test);//bool(true)
var_dump($test instanceof NotTest);//bool(false)
class SubTest extends Test{
}
$test=new SubTest;
var_dump($test instanceof SubTest);//bool(true)
var_dump($test instanceof Test);//bool(true)
interface MyInterface{
}
class MyImpl implements MyInterface{
}
$test=new MyImpl;
var_dump($test instanceof MyImpl);//bool(true)
var_dump($test instanceof MyInterface);//bool(true)
$d = 'NotMyClass';
var_dump($test instanceof $d);//bool(false)
?>