一文速学 - PHP7特性

php7新特性

前言

PHP 7+ 版本极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。
1、PHP 7 除了在性能方面有极大提升外,还添加了很多新的特性,如太空船操作符、标量类型声明、返回值的类型说明、全局的 throwable 接口、抽象语法树等。

2、在使用 PHP 7之前,我们在函数和类之间传递参数时不必声明变量类型。同样地,在返回数据时也不必声明变量类型。同样地,在返回数据时也不必声明变量类型。任何数据类型都可以被传递、返回。这样便给 PHP 带来了一个很大的问题——PHP 不清楚你传递的是什么类型的变量,函数、方法接收到的变量也不知道是什么类型。为了解决这个问题,PHP 7引入了类型声明,目前明确的有两类变量可以声明类型:形参、返回值。

3、PHP 7 支持的形参类型声明的类型有:字符串(string)、整型(int)、浮点型(float)以及布尔型(bool)。

4、PHP 7.1对函数返回值的声明做了扩充,可以定义其返回值为void,无论是否开启严格模式,只要函数中只能有“return;”,其他以外的其他return语句都会报错。

5、PHP 7.1.0对参数类型和返回值还有进一步的支持,其类型可以是可空类型,在参数或返回值类型声明前面加上“?”,表示返回值要么是null,要么是声明的类型

一、函数参数声明

1.一般模式

在php7中一个新的功能,标量类型声明已被接入,标量类型声明有两种方式

一般方式,默认模式

严格方式 - 严格模式有明确的暗示

示例: 一般模式
function sum(int ...$int){
    return array_sum($int)
}
print(sum(1,"2",3,4))
严格模式
declare(strict_type=1)
 function sum(int ...$int){
    return array_sum($int)
}
print(sum(1,"2",3,4)) //错误示例
print(sum(1,2,3,4))//正确示例

在严格模式中代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

可以使用的类型参数有:

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

以上程序由于采用了严格模式,所以如果参数中出现不适整数的类型会报错,执行输出结果为:

PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……

返回类型声明实例

实例中,要求返回结果为整数:

示例
<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
  return $value;
}

print(returnIntValue(5));
?>

以上程序执行输出结果为:

5
错误示例
<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
  return $value + 2.0;
}

print(returnIntValue(5));
?>

对于以上运行实际返回值为float 会导致异常

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
void 函数

一个新的返回值类型void被引入。 返回值声明为 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);

以上实例输出结果:

null
int(2)
int(1)

二、Null合并运算

之前需要先判断是否存在 再通过三元运算符去计算

var_dump(isset($GET["site"]) ? $GET["site"] : "空空如也");

现在可以通过?? 如果 G E T [ " s i t e " ] 存在并且有值则输出 GET["site"] 存在并且有值则输出 GET["site"]存在并且有值则输出GET[“site”] 否则输出空空如也

$GET = array('site'=>"ccc");
var_dump($GET["site"] ?? '空空如也');

三、太空船运算

PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 a ∗ ∗ 和 ∗ ∗ a** 和 ** ab,如果 a ∗ ∗ 小于、等于或大于 ∗ ∗ a** 小于、等于或大于 ** a小于、等于或大于b时,它分别返回-1、0或1。

示例

<?php
// 整型比较
print( 1 <=> 1);print("<br/>");
print( 1 <=> 2);print("<br/>");
print( 2 <=> 1);print("<br/>");

// 浮点型比较
print( 1.5 <=> 1.5);print("<br/>");
print( 1.5 <=> 2.5);print("<br/>");
print( 2.5 <=> 1.5);print("<br/>");

// 字符串比较
print( "a" <=> "a");print("<br/>");
print( "a" <=> "b");print("<br/>");
print( "b" <=> "a");print("<br/>");
?>

以上程序执行输出结果为:

0
-1
1

0
-1
1

0
-1
1

四、 常量数组

在 PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。

示例

<?php
// 使用 define 函数来定义数组
define('sites', [
   'Google',
   'Runoob',
   'Taobao'
]);

print(sites[1]);
?>

以上程序执行输出结果为:

Runoob

五、匿名内部类

PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。

示例

<?php
interface Logger {
  public function log(string $msg);
}

class Application {
  private $logger;

  public function getLogger(): Logger {
   return $this->logger;
  }

  public function setLogger(Logger $logger) {
   $this->logger = $logger;
  } 
}

$app = new Application;
// 使用 new class 创建匿名类
$app->setLogger(new class implements Logger {
  public function log(string $msg) {
   print($msg);
  }
});

$app->getLogger()->log("我的第一条日志");
?>

以上程序执行输出结果为:

我的第一条日志
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Faster R-CNN是一种目标检测算法,用于在图像中定位和识别物体。它是R-CNN算法的改进版本,通过引入区域提议网络(Region Proposal Network,RPN)来提高检测的速度。 Faster R-CNN的工作流程可以分为两个阶段:区域提议和物体分类。 在区域提议阶段,首先使用卷积神经网络(CNN)对输入图像进行特征提取。然后,RPN通过滑动窗口在特征图上生成一系列候选区域。每个候选区域都有一个边界框(bounding box)和一个预测得分。RPN通过一个二分类器来判断每个候选区域是否包含感兴趣的物体,并根据得分对候选区域进行排序。 在物体分类阶段,对于每个候选区域,使用RoI池化层将其映射为固定大小的特征向量。然后,这些特征向量通过全连接层进行分类和回归,得到每个候选区域的类别预测和边界框坐标调整。 整个网络采用端到端的训练方式,在训练过程中同时优化RPN和分类网络。训练时,通过计算候选区域与真实标注框之间的IoU(交并比)来确定正负样本,并使用多任务损失函数进行优化。 Faster R-CNN相比于R-CNN,通过引入RPN网络实现了端到端的训练,避免了繁琐的候选区域提取过程,大大提高了检测的速度和准确性。同时,Faster R-CNN还可以通过改变RPN的输出尺度来检测不同大小的物体。这使得Faster R-CNN成为目标检测领域的重要方法之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan Wang&YuanyuanLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值