PHP各版本特性
从 PHP 5.6.x 移植到 PHP 7.0.x: https://www.php.net/manual/zh/migration70.new-features.php 从 PHP 7.0.x 移植到 PHP 7.1.x: https://www.php.net/manual/zh/migration71.new-features.php 从 PHP 7.1.x 移植到 PHP 7.2.x https://www.php.net/manual/zh/migration72.new-features.php 从 PHP 7.2.x 移植到 PHP 7.3.x https://www.php.net/manual/zh/migration73.new-features.php 从 PHP 7.3.x 移植到 PHP 7.4.x https://www.php.net/manual/zh/migration74.new-features.php 从 PHP 7.4.x 移植到 PHP 8.0.x https://www.php.net/manual/zh/migration80.php
PHP 常用技巧
Array 数组 https://www.php.net/manual/zh/language.types.array.php 类型转换的判别 https://www.php.net/manual/zh/language.types.type-juggling.php 类型声明 https://www.php.net/manual/zh/language.types.declarations.php 字符串操作函数 https://www.php.net/manual/zh/book.strings.php Resource 资源类型 https://www.php.net/manual/zh/language.types.resource.php NULL https://www.php.net/manual/zh/language.types.null.php
# random_bytes(PHP 7, PHP 8)
生成适合于密码学使用的任意长度的加密随机字节串,例如生成盐类、密钥或初始化向量时。 $bytes = random_bytes(1); echo bin2hex($bytes); // 运行结果:a5 $bytes = random_bytes(2); echo bin2hex($bytes); // 运行结果:ce5b $bytes = random_bytes(3); echo bin2hex($bytes); // 运行结果:a15458 $bytes = random_bytes(6); echo bin2hex($bytes); // 运行结果:53fbae22ef5a $bytes = random_bytes(16); echo bin2hex($bytes); // 运行结果:139c2286c65789806198ba5a9e91cc78 $bytes = random_bytes(32); echo bin2hex($bytes); // 运行结果:8af703b42d4615f840e77f0751c7a998fac231ab2bef70b22b9b27ff14664d19 $bytes = random_bytes(128); echo bin2hex($bytes); // 运行结果:67ecf3b8caa71505c1526a0612e8daa1682c501aaf0846129ee453f2ddad7ccaea9360c3bd1625 c8a23d0b5a6ef6d3dcf41e845eaee348591b58869b73ea5b6df691a97cce8ef61806353f8f7a9ad797c8910a9e9 3d3f06105f4be556d4291cd9cd94b628fb4473e8ba03c6af849ded6b431752b3f90d225769e7559749d0eec
# bin2hex (PHP 4, PHP 5, PHP 7, PHP 8)
bin2hex — 函数把包含数据的二进制字符串转换为十六进制值。 把二进制的参数 str 转换为的十六进制的字符串。转换使用字节方式,高四位字节优先。 说明 bin2hex(string $str): string 返回指定字符串十六进制的表示。
# random_int(PHP 7, PHP 8)
echo random_int(100, 999); // 运行结果:214 echo random_int(-1000, 0); // 运行结果:-283
# null合并运算符(从 PHP 5.6.x 移植到 PHP 7.0.x)
由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。 如果变量存在且值不为null, 它就会返回自身的值,否则返回它的第二个操作数。 <?php // Fetches the value of $_GET['user'] and returns 'nobody' // if it does not exist. $username = $_GET['user'] ?? 'nobody'; // This is equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; // This is equivalent to: $username = isset($_GET['user']) ? $_POST['user'] : 'nobody';
# 通过 define() 定义常量数组(从 PHP 5.6.x 移植到 PHP 7.0.x)
Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。 <?php define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat" ?>
# 组使用声明(从 PHP 5.6.x 移植到 PHP 7.0.x)
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。 <?php // PHP 7 之前的代码 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ 及更高版本的代码 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC}; ?>
# 整数除法函数 intdiv()(从 PHP 5.6.x 移植到 PHP 7.0.x)
新加的函数 intdiv() 用来进行 整数的除法运算。 <?php var_dump(intdiv(10, 3)); ?> 以上例程会输出: int(3)
# Void 函数(从 PHP 7.0.x 移植到 PHP 7.1.x)
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。 <?php function swap(&$left, &$right) : void { if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp; } $a = 1; $b = 2; var_dump(swap($a, $b), $a, $b); 以上例程会输出: null int(2) int(1) 试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。
# 类常量可见性(从 PHP 7.0.x 移植到 PHP 7.1.x)
现在起支持设置类常量的可见性。 <?php class ConstDemo { const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4; }
# 多异常捕获处理
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。 <?php try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions }
# list — 把数组中的值赋给一组变量
<?php $info = array('coffee', 'brown', 'caffeine'); // 列出所有变量 list($drink, $color, $power) = $info; echo "$drink is $color and $power makes it special.\n"; // 运行结果:coffee is brown and caffeine makes it special. // 列出他们的其中一个 list($drink, , $power) = $info; echo "$drink has $power.\n"; // 运行结果:coffee has caffeine. // 或者让我们跳到仅第三个 list( , , $power) = $info; echo "I need $power!\n"; // 运行结果:I need caffeine! // list() 不能对字符串起作用 list($bar) = "abcde"; var_dump($bar); // 运行结果:null $data = [ ["id" => 1, "name" => 'Tom'], ["id" => 2, "name" => 'Fred'], ]; // list() style list("id" => $id1, "name" => $name1) = $data[0]; echo $id1.'----'.$name1.'----'; // 运行结果:1----Tom---- // [] style ["id" => $id1, "name" => $name1] = $data[0]; echo $id1.'===='.$name1.'===='; // 运行结果:====Tom====- // list() style foreach ($data as list("id" => $id, "name" => $name)) { // logic here with $id and $name echo $id1.'----'.$name1.'----|'; } // 运行结果:1----Tom----|1----Tom----| // [] style foreach ($data as ["id" => $id, "name" => $name]) { // logic here with $id and $name echo $id.'<====>'.$name; } // 运行结果:1<====>Tom2<====>Fred
# 支持为负的字符串偏移量(从 PHP 7.0.x 移植到 PHP 7.1.x)
<?php echo "abcdef"[-2]; // 运行结果:e $string = 'bar'; echo "The last character of '$string' is '$string[-1]'.\n"; // 运行结果:The last character of 'bar' is 'r'.
# 调换2个变量的值
<?php function swap( &$a, &$b ): void { [ $a, $b ] = [ $b, $a ]; } $a = 1; $b = 2; swap( $a, $b ); echo '$a='.$a.',$b='.$b; // 运行结果:$a=2,$b=1
# 示例 #11 类型强制转换为联合类型的例子
参考 https://www.php.net/manual/zh/language.types.declarations.php <?php // int|string 42 --> 42 // 类型完全匹配 "42" --> "42" // 类型完全匹配 new ObjectWithToString --> "__toString() 的结果" // object 不兼容 int,降级到 string 42.0 --> 42 // float 与 int 兼容 42.1 --> 42 // float 与 int 兼容 1e100 --> "1.0E+100" // float 比 int 大太多了,降级到 string INF --> "INF" // float 比 int 大太多了,降级到 string true --> 1 // bool 与 int 兼容 [] --> TypeError // array 不兼容 int 或 string // int|float|bool "45" --> 45 // int 的数字字符串 "45.0" --> 45.0 // float 的数字字符串 "45X" --> true // 不是数字字符串,降级到 bool "" --> false // 不是数字字符串,降级到 bool "X" --> true // 不是数字字符串,降级到 bool [] --> TypeError // array 不兼容 int、float、bool ?>