比较运算符
== != <> < > <= >= === !==
注意:
1.<>与!=作用相同
2.===和!==这两个运算符不会对操作数进行数据类型转换,类型不同,比较的结果为“不相等”
3.如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。
<=> 太空船运算符
对于表达式"$a<=>$b",当$a小于、等于或大于$b就分别返回一个负整数、0和正整数。
比较运算符在处理多种类型时,按如下规进行类型转换或比较
操作数1 | 操作数2 | 结果 |
---|---|---|
null | string | 将 null 转换为 "",进行数字或词汇比较 |
bool 或 null | 任何其它类型 | 转换为 bool,FALSE < TRUE |
string,resource 或 number | string,resource 或 number | 将字符串和资源转换成数字,按普通数学比较 |
object | object | 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明 |
array | array | 具有较少成员的数组较小,如果操作数 1 中的键不存在于操作数 2 中则数组无法比较,否则挨个值比较 |
object | 任何其它类型 | object 总是更大 |
array | 任何其它类型 | array 总是更大 |
规则:
1.对于数组和对象,特殊处理
2.如果一个操作数是null或bool值,则将两个操作数都转换为bool值,有个例外是null与string比较,这时相当于""与string比较
3.其他情况按字符串或数值的规则进行比较
var_dump(3 == true);
var_dump('3' == true);
var_dump(3 > null);
var_dump('3' > null);
var_dump('0' == null); // false
4.如果是字符串与字符串比较,那么只有当两个字符串都是纯数值时,转换为数值后再比较,其它情况都按词汇比较
5.如果是字符串与数值比较,都是将字符串转换为数值后再比较
$a = "3a";
$b = "a";
$c = $a > $b;
var_dump((int)$a); // int(3)
var_dump((int)$b); // int(0)
var_dump($c); // bool(false)
$a = "3a";
$b = "22";
$c = $a > $b;
var_dump((int)$a); // int(3)
var_dump((int)$b); // int(22)
var_dump($c); // bool(true)
$a = "3";
$b = "22";
$c = $a > $b;
var_dump((int)$a); // int(3)
var_dump((int)$b); // int(22)
var_dump($c); // bool(false)
$a = "3a";
$b = 22;
$c = $a > $b;
var_dump((int)$a); // int(3)
var_dump((int)$b); // int(22)
var_dump($c); // bool(false)
$a = "33a";
$b = 22;
$c = $a > $b;
var_dump((int)$a); // int(33)
var_dump((int)$b); // int(22)
var_dump($c); // bool(true)
?? NULL合并运算符
返回从左到右第一个存在且非null操作数,如果操作数都是NULL,则结果为NULL。可以连着使用:
$a ?? $b ?? $c
++/-- 自增自减运算符
$a = true;$b = "string";
$a++;
$b++;
echo var_dump($a); // bool(true)
echo var_dump($b); // string(6) "strinh"
对于布尔值,不管是前后递增还是前后递减,都没有效果。
对于NULL,递增将使变量变为整数1,递减则没有效果。
$a = null;
$b = null;
var_dump(++$a); // int(1)
var_dump(--$b); // NULL
对于字符串,遵循以下规则:
1.只支持递增,不支持递减,递减无效果
2.可递增的有效字符只包括a-z、A-Z和数字字符
3.递增是从字符串最右端开始,按照与整数+1类似的方式进行递增,即z+1得到a并进位,Z+1得到A并进位,9+1得到0并进位。直接遇到一个无效字符为止。
$a = 'abc'; // abd
$b = 'abz'; // aca
$c = 'Z'; // AA
$d = 'z'; // aa
$e = '99'; // int(100)
$f = '99!'; // 99!
$g = '99!99'; // 99!00
?: 条件运算符
用法:
1. (expr1) ? (expr2) : (expr3),如果expr1为true,表达式的值为expr2,否则为expr3
2. (expr1) ? : (expr3),如果expr1为true,表达式的值为expr1,否则为expr3
@ 错误控制运算符
当我们在表达式的前面加上错误控制运算符时,表达式可能产生的错误信息将会被忽略。
@ 运算符只对表达式有效。例如,可以把它放在变量,函数和 include 调用,常量之前。不能把它放在函数或类的定义之前,也不能用于条件结构 if i或 foreach 等。
目前的"@"错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。这意味着如果在某个不存在或者敲错了字母的函数调用前用了"@"来抑制错误信息,那脚本会没有任何迹象显示原因而死在那里。
`` 执行运算符
这个运算符的作用是用于运算shell命令。PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。使用反引号运算符"`"的效果与函数 shell_exec() 相同。反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
$a = `dir`;
echo $a;
[] {} 下标访问
用 [] 或 {}可以访问数组元素,如果访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回 NULL。
instanceof 类型运算符
用于确定一个 PHP 变量(只能是变量)是否属于某一类 class 的实例,例如:
class MyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass); // bool(true)
变量如果不是一个对象,则结果为false。
如果类型是一个父类、一个接口,类名称、父类名称或接口名称的字符串形式,或者是一个同类对象、一个父类对象,都可以返回trueinterface MyInterface
{
}
class ParentClass implements MyInterface
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
$b = new ParentClass;
$stra = 'MyClass';
$strb = 'ParentClass';
$strc = 'MyInterface';
$strd = '$b';
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
var_dump($a instanceof MyInterface);
var_dump($a instanceof $stra);
var_dump($a instanceof $strb);
var_dump($a instanceof $strc);
var_dump($a instanceof $b);
注意,如果要使用名称字符串,只能通过变量,就像上例中的$stra一样,不是直接使用字符串字面值,否则出错。
declare
用来设定一段代码的执行指令。也就是控制指定代码的执行行为,包括两种形式:
declare (指令)
statement; // 语句部分可以是语句块
declare (指令);
第一种形式将指令应用于指定的语句,第二种形式则应用于整个脚本文件(如果文件被包含,不会对父文件产生影响)。
指令包括:
1.ticks=N
2.encoding="字符编码"
3.strict_types=N
Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的指令(directive)部分用 ticks=N 来指定的。
注意,不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。 每个 tick 中出现的事件由 register_tick_function() 来指定。
declare(ticks=1);
function tick_handler(){
static $count = 1;
echo "tick: $count\n";
$count++;
}
register_tick_function('tick_handler');
$a = 1;
$a = 2;
$b = $a * 2;
while($b > 0) {
echo "$b\n";
$b--;
}
-------------------
tick: 1
tick: 2
tick: 3
tick: 4
4
tick: 5
tick: 6
3
tick: 7
tick: 8
2
tick: 9
tick: 10
1
tick: 11
tick: 12
tick: 13
encoding用于指定编码方式,例如:
declare(encoding='ISO-8859-1');
注意,当和命名空间结合起来时 declare 的唯一合法语法是 declare(encoding='...');,不能使用declare(encoding='...') {} 形式。
strict_types用于对脚本文件启用严格模式,在严格模式中,当调用一个函数时,如果函数作了类型声明(参数或返回值),那么只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。 唯一的一个例外是可以将integer传给一个期望float的函数。
严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。 一个没有启用严格模式的文件内调用了一个在启用严格模式的文件中定义的函数,那么将会遵循调用者的偏好(弱类型),而这个值将会被转换。
同时,严格类型仅用于标量类型声明,也正是因为如此,这需要PHP 7.0.0 或更新版本,因为标量类型声明也是在那个版本中添加的。
declare(strict_types=1);
function test(float $x) {
return $x * $x;
}
echo test("2x"); // 异常
return 返回
如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return 也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include 的或者 require 的,则控制交回调用文件。此外,如果当前脚本是被 include 的,则 return 的值会被当作 include 调用的返回值。如果在主脚本文件中调用 return,则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行(这两个选项用于指定自动包含的文件)。