php7特性+类型比较+类型转换

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
?>


(完)