类型比较

虽然PHP是弱类型语言,但是对于变量的比较还是有一些不同

松散比较:使用==比较,只比较值,不比较类型

严格比较:使用===比较,除了比较值,也比较类型

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$x="25";
$y=25;

var_dump($x);
var_dump($y);

if ($x==$y){
echo "True\n";
}else{
echo "False\n";
}

if ($x===$y){
echo "True\n";
}else{
echo "False\n";
}

运行结果:
1
2
3
4
string(2) "25"
int(25)
True
False

可以看到$x是”25”是一个字符串,而$y是一个整型

但是在使用==时会判等,因为只比较了值而没有比较类型

avatar
avatar

常量

PHP5中增加了一条规则:常量被定义后,在脚本的其他任何地方都不能改变

常量是一个简单的标识符,该值在脚本中不能被改变

设置常量

设置常量使用define()函数

1
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

有三个参数:
name:必选参数,常量名称,即标识符

value:必选参数,常量的值

case_insensitive:可选参数,如果设置为True,该常量则大小写不敏感。默认时大小写敏感的

例如:

1
2
3
4
5
<?php
// 区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com");
echo GREETING; // 输出 "欢迎访问 Runoob.com"
echo greeting; // 输出 "greeting"

不区分大小写:

1
2
3
4
<?php
// 不区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com", true);
echo greeting; // 输出 "欢迎访问 Runoob.com"

常量是全局的,常量在定义之后,默认是全局变量,可以在任意地方使用

1
2
3
4
5
6
7
8
<?php
define("GREETING", "欢迎访问 Runoob.com");

function myTest() {
echo GREETING;
}

myTest(); // 输出 "欢迎访问 Runoob.com"

字符串变量

字符串变量用于存储并处理文本

字符串变量用于包含有字符的值,在创建字符串之后,就可以进行操作了

1
2
3
<?php
$txt="Hello world!";
echo $txt;

运行结果就是$txt中的值

PHP7的版本中,不再区分单引号和双引号,使用哪一个都可以定义字符串变量

并置运算符

PHP中只有一个字符串运算符,就是.用于把两个字符串值连接起来

1
2
3
4
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;

运行结果:

1
Hello world! What a nice day!

strlen()函数

看函数名字基本上就知道是返回字符串长度的函数

1
2
<?php
echo strlen("Hello world!");

运行结果就是12

该函数常常用在循环和其他函数中,因为确定字符串何时结束是很重要的

strpos()函数

strpos()函数用于在字符串中查找一个字符或一段指定的文本,如果字符串中找到匹配,就会返回第一个匹配的字符位置,如果没找到就返回False

1
2
<?php
echo strpos("Hello world!","world");

运行结果为6

这里为什么不是7,是因为字符串中的第一个字符是以0开始而不是1

完整PHP String手册参考一下
https://www.runoob.com/php/php-ref-string.html

运算符

算数运算符

描述 引入方法 描述 实例 结果
x + y x 和 y 的和 2 + 2 4
x - y x 和 y 的差 5 - 2 3
x * y x 和 y 的积 5 * 2 10
x / y x 和 y 的商 15 / 5 3
x % y x 除以 y 的余数 5 % 2 1
- x 取反 x 取反 $x=-2 echo -$x -2
a . b 并置 连接两个字符串 “Hi” . “Ha” HiHa

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$x=10;
$y=6;
echo ($x + $y); // 输出16
echo "\n"; // 换行

echo ($x - $y); // 输出4
echo "\n"; // 换行

echo ($x * $y); // 输出60
echo "\n"; // 换行

echo ($x / $y); // 输出1.6666666666667
echo "\n"; // 换行

echo ($x % $y); // 输出4
echo "\n"; // 换行

echo -$x;

运行结果:
1
2
3
4
5
6
16
4
60
1.6666666666667
4
-10

PHP7+之后增加了整除运算符intdiv()
1
2
<?php
var_dump(intdiv(10, 3));

运行结果:
1
int(3)

赋值运算符

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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$x=10;
echo $x; // 输出10
echo "\n";

$y=20;
$y += 100;
echo $y; // 输出120
echo "\n";

$z=50;
$z -= 25;
echo $z; // 输出25
echo "\n";

$i=5;
$i *= 6;
echo $i; // 输出30
echo "\n";

$j=10;
$j /= 5;
echo $j; // 输出2
echo "\n";

$k=15;
$k %= 4;
echo $k; // 输出3
echo "\n";

运行结果:
1
2
3
4
5
6
10
120
25
30
2
3

递增/递减运算符

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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$x=10;
echo ++$x; // 输出11
echo "\n";

$y=10;
echo $y++; // 输出10
echo "\n";

$z=5;
echo --$z; // 输出4
echo "\n";

$i=5;
echo $i--; // 输出5
echo "\n";

运行结果:
1
2
3
4
11
10
4
5

比较运算符

运算符 名称 描述 实例
x==y 等于 如果x等于y,则返回true 5==8返回false
x===y 绝对等于 如果x等于y,且它们类型相同,则返回true 5===”5”返回false
x!=y 不等于 如果x不等于y,则返回true 5!=8返回true
x<>y 不等于 如果x不等于y,则返回true 5<>8返回true
x!==y 绝对不等于 如果x不等于y,或它们类型不相同,则返回true 5!==”5”返回true
x>y 大于 如果x大于y,则返回true 5>8返回false
x<y 小于 如果x小于y,则返回true 5<8返回true
x>=y 大于等于 如果x大于或者等于y,则返回true 5>=8返回false
x<=y 小于等于 如果x小于或者等于y,则返回true 5<=8返回true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$x=100;
$y="100";

var_dump($x == $y);

var_dump($x === $y);

var_dump($x != $y);

var_dump($x !== $y);

$a=50;
$b=90;

var_dump($a > $b);

var_dump($a < $b);

运行结果:

1
2
3
4
5
6
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)

逻辑运算符

运算符 名称 描述 实例
x and y 如果x和y都为true,则返回true x=6 y=3 (x<10 and y>1)返回true
x or y 如果x和y至少有一个为true,则返回true x=6 y=3 (x==6 or y==5)返回true
x xor y 异或 如果x和y有且仅有一个为true,则返回true x=6 y=3 (x==6 xor y==3)返回false
x && y 如果x和y都为true,则返回true x=6 y=3 (x<10 && y>1)返回true
!x 如果x不为true,则返回true x=6 y=3 !(x==y)返回true

数组运算符

运算符 名称 描述
x+y 集合 x和y的集合
x==y 相等 如果x和y具有相同的键/值对,则返回true
x===y 恒等 如果x和y具有相同的键/值对,且顺序相同类型相同,则返回true
x!=y 不相等 如果x不等于y,则返回true
x<>y 不相等 如果x不等于y,则返回true
x!==y 不恒等 如果x不等于y,则返回true
1
2
3
4
5
6
7
8
9
10
<?php
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$z = $x + $y; // $x 和 $y 数组合并
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
array(4) {
["a"]=>
string(3) "red"
["b"]=>
string(5) "green"
["c"]=>
string(4) "blue"
["d"]=>
string(6) "yellow"
}
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)

三元运算符

另一个条件运算符是”?:”(或三元)运算符

1
(expr1) ? (expr2) : (expr3)

expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3

1
2
3
4
5
6
7
8
9
<?php
$test = '菜鸟教程';
// 普通写法
$username = isset($test) ? $test : 'nobody';
echo $username, PHP_EOL;

// PHP 5.3+ 版本写法
$username = $test ?: 'nobody';
echo $username, PHP_EOL;

运行结果:

1
2
菜鸟教程
菜鸟教程

注意:PHP_EOL 是一个换行符,兼容更大平台

PHP7+版本多了一个NULL合并运算符??

1
2
3
4
5
<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

组合比较符(PHP7+)

PHP7+ 支持组合比较符,也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较

1
$c = $a <=> $b;

解析如下:
如果$a>$b,则$c的值为1
如果$a==$b,则$c的值为0
如果$a<$b,则$c的值为-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

<?php
// 整型
echo 1 <=> 1; // 0
echo "\n";
echo 1 <=> 2; // -1
echo "\n";
echo 2 <=> 1; // 1
echo "\n";

// 浮点型
echo 1.5 <=> 1.5; // 0
echo "\n";
echo 1.5 <=> 2.5; // -1
echo "\n";
echo 2.5 <=> 1.5; // 1
echo "\n";

// 字符串
echo "a" <=> "a"; // 0
echo "\n";
echo "a" <=> "b"; // -1
echo "\n";
echo "b" <=> "a"; // 1
echo "\n";

运行结果:

1
2
3
4
5
6
7
8
9
0
-1
1
0
-1
1
0
-1
1

总结

1.==和===很常用,可以理解为前者睁一只眼闭一只眼,后者一只都不闭

2.define()是PHP5版本的函数,在PHP7+之后基本上都使用在类的内部定义的常量。使用const申明定义,以后遇到类再说

3.intdiv()类似于取整函数,向下取整而不是四舍五入

4.字符串和数组一样都是以0开头计数