大家好,我是黄啊码,最近说到php从入门到拆门,有网友说,门都还没进,怎么拆门?那咱们现在就从php7说起,至于入门的太简单,我就略过了,大家加油,不懂Q我吧。
据网友测评,PHP 7+ 版本极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。
PHP 7+ 版本新加特性如下表所示:
目录
PHP 标量类型与返回值类型声明
那什么是强制类型,什么又是严格类型?
那什么是严格类型?
void 函数
PHP 标量类型与返回值类型声明
默认情况下,所有的PHP文件都处于弱类型校验模式。
PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式:
- 强制模式 (默认)
- 严格模式
标量类型声明语法格式:
declare(strict_types=1);
代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。
可以使用的类型参数有:
- int
- float
- bool
- string
- interfaces
- array
- callable
那什么是强制类型,什么又是严格类型?
比如:
<?php
// 强制模式
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(3, '3', 9.1));
?>
简单来说就是比如:你在做数字计算时,这里的字符串3会自动帮你强制转换成数字3,然后再次计算 ,又因为我们声明了这是整数类型,所以9.1会自动转换成9
那什么是严格类型?
黄啊码:我也不怎么说,就是不听话就报错吧,叫你传数字,你传字符串我就给你报个错,让你知道什么叫做对。
哈哈哈,比如:
<?php
// 严格模式
declare(strict_types=1);
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(3, '3', 9.1));
?>
假如我们把这句代码declare(strict_types=1);去掉,那运行毫无问题,但是,加上了就给你安了道门,过不了我这关,就别想继续走了,看这报错。。是不是贼难受?
Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned.
void 函数
一个新的返回值类型void被引入。 这玩意看上去是不是特别熟悉,学习过java或者.net的应该特别清楚吧,就是我啥都不用返回,而在php7中返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。
返回的类型还有 void,定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。
void 函数可以省去 return 语句,或者使用一个空的 return 语句。
<?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);
结果
是不是特别的哇塞??
PHP NULL 合并运算符
PHP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。
NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。
以前我们这样写三元运算符:
$site = isset($_GET['site']) ? $_GET['site'] : '黄啊码';
现在我们可以直接这样写:
$site = $_GET['site'] ?? '黄啊码';
PHP 太空船运算符(组合比较符)
php7还新出了一个运算符<=>,我把它当成上天符,因为官方叫它做太空船运算符,用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。
实例
<?php
// 整型比较
print( 1 <=> 1);
print( 1 <=> 2);
print( 2 <=> 1);
// 浮点型比较
print( 1.5 <=> 1.5);
print( 1.5 <=> 2.5);
print( 2.5 <=> 1.5);
// 字符串比较
print( "a" <=> "a");
print( "a" <=> "b");
print( "b" <=> "a");
结果输出都是 0 -1 1
个人来讲,太空船符号比较鸡肋,毕竟大小我们有比较符号
PHP 常量数组
这个小知识点就不必多讲了,类似与变量数组,只不过php5.6用的是const进行声明
<?php
// 使用 define 函数来定义数组
define('sites', [
'Google',
'黄啊码',
'Taobao'
]);
print(sites[1]);
?>
输出:黄啊码
PHP 匿名类
PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。匿名类可以直接定义给变量,可以在方法中使用return返回,也可以当做参数传递给方法内部。其实,匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。
这里啊码一次性给了三个例子,你们自己尝尝鲜:
class A {
public $propA = 'A';
public function getProp(){
echo $this->propA;
}
}
trait B {
public function getName(){
echo 'trait B';
}
}
interface C {
public function show();
}
$p4 = 'b4';
$objC = new class($p4) extends A implements C {
use B;
private $prop1 = 'b1';
protected $prop2 = 'b2';
public $prop3 = 'b3';
public function __construct($prop4){
echo $prop4;
}
public function getProp(){
parent::getProp();
echo $this->prop1, '===', $this->prop2, '===',$this->prop3,'===', $this->propA;
$this->getName();
$this->show();
}
public function show(){
echo 'show';
}
};
$objC->getProp();
PHP Closure::call()
PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。
<?php
class A {
private $x = 1;
}
// PHP 7 之前版本定义闭包函数代码
$getXCB = function() {
return $this->x;
};
// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A');
echo $getX();
print(PHP_EOL);
// PHP 7+ 代码
$getX = function() {
return $this->x;
};
echo $getX->call(new A);
?>
输出结果分别为:1 1
有网友说,php都到8了,为什么你还跟我说php7,我想问,php都到8了,为什么你写代码还用5呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。
好了,今天的分享就这里,有问题的留个言,别忘了一键三连,下次我们还会再见!
我是黄啊码,码字的码,退。。。退。。。退。。。朝!