一、运算符
1、算术运算符
-$a 取反 $a 的负值。
$a + $b 加法 $a 和$b 的和。
$a - $b 减法 $a 和$b 的差。
$a * $b 乘法 $a 和$b 的积。
$a / $b 除法 $a 除以$b 的商。
$a % $b 取模 $a 除以$b 的余数。
注意:一般情况下除法运算符返回浮点数。但如果两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
取模运算符 % 的结果和被除数的符号相同。即 $a % $b 的结果和 $a 的符号相同。
2、位运算符
$a & $b and(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
$a shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示乘以 2)。
$a >> $b shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示除以 2)。
注意:位移在 php 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。3、比较运算符
$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 小与 true,如果$a 严格小于 $b。
$a > $b 大于 true,如果$a 严格大于 $b。
$a 小于等于 true,如果$a 小于或者等于 $b。
$a >= $b 大于等于 true,如果$a 大于或者等于 $b。
注意:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。对于多种类型,比较运算符根据下表比较:
null或string string 将 null 转换为 ,进行数字或词汇比较
bool或null 任何其它类型 转换为bool,false true
object object 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(php 4 中),php 5 有其自己的说明
string,resource或number string,resource或number 将字符串和资源转换成数字,按普通数学比较
array array 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
object 任何其它类型 object总是更大
array 任何其它类型 array总是更大
4、错误控制运算符php 支持一个错误控制运算符:@当将其放置在一个 php 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
5、执行运算符
php 支持一个执行运算符:反引号(``)。php 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回。
6、自增/自减运算符
++$a 前加 $a 的值加一,然后返回$a。
$a++ 后加 返回 $a,然后将$a 的值加一。
--$a 前减 $a 的值减一, 然后返回$a。
$a-- 后减 返回 $a,然后将$a 的值减一。
7、逻辑运算符
$a and $b and(逻辑与) true,如果$a 和 $b 都为 true。
$a or $b or(逻辑或) true,如果$a 或 $b 任一为 true。
$a xor $b xor(逻辑异或) true,如果$a 或 $b 任一为 true,但不同时是。
! $a not(逻辑非) true,如果$a 不为 true。
$a && $b and(逻辑与) true,如果$a 和 $b 都为 true。
$a || $b or(逻辑或) true,如果$a 或 $b 任一为 true。
8、数组运算符
$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。
9、类型运算符instanceof 用于确定一个 php 变量是否属于某一类class的实例。
10、运算符优先级
结合方向
运算符
无
clone new
左
[
右
++ -- ~ (int) (float) (string) (array) (object) (bool) @
无
instanceof
右
!
左
* / %
左
+ - .
左
>
无
== != === !==
左
&
左
^
左
|
左
&&
左
||
左
? :
右
= += -= *= /= .= %= &= |= ^= >= =>
左
and
左
xor
左
or
左
,
二、流程控制if else语句;
三元运算符:(expr)?(contents):(contents),与c语言类似;
switch case语句;
for、wihle、do while循环;
break、continue跳转语句;
foreach循环:
foreach (array_expression as $value) statementforeach (array_expression as $key => $value) statement
return 语句;require与include语句:作用都是包含并运行指定文件。但处理失败的方式不同,require 在出错时产生e_compile_error 级别的错误,导致脚本中止执行,而include只产生警告(e_warning),脚本会继续运行。
include_once与require_once语句:与include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。
goto语句:goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是goto 之后接上目标位置的标记。php 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用goto 代替多层的 break。
ddeclare语句:
declare 结构用来设定一段代码的执行指令。
declare (directive) statement
directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks以及 encoding
tick(时钟周期)是一个在 declare 代码段中解释器每执行n 条可计时的低级语句就会发生的事件。n 的值是在 declare 中的 directive 部分用ticks=n 来指定的。
不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。
在每个 tick 中出现的事件是由register_tick_function()来指定的。
例:
declare(ticks=1);
// a function called on each tick event
function tick_handler()
{
echo tick_handler() called\n;
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
输出:tick_handler() called tick_handler() called tick_handler() called 3tick_handler() called tick_handler() called tick_handler() called tick_handler() called
解释一下所谓的低级语句:主要包括statement, function_declare_statement, class_declare_statement。
statement包括:
(1) 简单语句:空语句(就一个;号),return,break,continue,throw, goto,global,static,unset,echo, 内置的html文本,分号结束的表达式等均算一个语句。
(2) 复合语句:完整的if/elseif,while,do...while,for,foreach,switch,try...catch等算一个语句。
(3) 语句块:{} 括出来的语句块。
解释上面输出的原因:1、$a = 1;
2、if语句判断条件成立;
3、$a +=2;
4、print语句;(故前面输出3次tick_handler() called后输出$a即3;)
5、if语句条件不成立;
6、函数tick_handler()定义语句;
7、register_tick_handler()语句;
8、declare()语句。(故再次输出4次tick_handler() called)
