首頁 > 後端開發 > PHP7 > 快速了解PHP7.X各版本的新特性

快速了解PHP7.X各版本的新特性

青灯夜游
發布: 2023-02-18 10:22:02
轉載
2959 人瀏覽過

這篇文章帶大家來了解PHP7.X各版本(7.0、7.1、7.2、7.3、7.4)的新特性,有需要的可以看看,希望對大家有幫助!

快速了解PHP7.X各版本的新特性

大家都知道,php現在不斷地更新壯大,每個版本都有一次效能的提升,接下來我將跟大家講解下PHP7.X的新的特性。我會按照每個版本的特性來講解。

  1. PHP7.0新功能 
  2. PHP7.1新功能 
  3. PHP7.2新特性
  4. PHP7.3新特性
  5. PHP7.4新特性

#PHP7.0新功能 

1.標量類型的宣告

標量型別宣告有兩種模式: 強制(預設) 和嚴格模式。現在可以使用下列型別參數(無論是強制模式或嚴格模式): 字串(string), 整數(int), 浮點數(float) , 以及布林值(bool)。它們擴充了PHP5中引入的其他類型:類別名,接口,數組#和 

<span class="type"></span><em></em><span class="type"></span>。 PHP標量包含: 字串(<em></em>string

), 整數(

int

#), 浮點數(

float

), 以及布林值(

bool

)。

例如下面我們定義一個形式參數為整數的參數。 (正確的如下)

<?php
//Enter your code here, enjoy!
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
 
var_dump(sumOfInts(2, &#39;3&#39;, 4.1));
登入後複製

輸出:

int(9)
登入後複製

例如下面我們定義一個形式參數為整數的參數。 (錯誤的如下)

<?php
//Enter your code here, enjoy!
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
 
var_dump(sumOfInts(2, &#39;error&#39;, 4.1));//参数里面有字符串,我们声明的是整数
登入後複製
輸出錯誤訊息:
<br />
<b>Fatal error</b>:  Uncaught TypeError: Argument 2 passed to sumOfInts() must be of the type integer, string given, called in [...][...] on line 8 and defined in [...][...]:3
Stack trace:
#0 [...][...](8): sumOfInts(2, &#39;error&#39;, 4.1)
#1 {main}
  thrown in <b>[...][...]</b> on line <b>3</b><br />
登入後複製

2.傳回值型別宣告

PHP 7 增加了對傳回型別宣告的支持。類似於參數類型聲明,傳回類型聲明指明了函數傳回值的類型。可用的類型與參數聲明中可用的類型相同。

例如下面我們定義一個傳回值為陣列的函數。

<?php
 
function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}
 
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
登入後複製

輸出:

Array
(
    [0] => 6
    [1] => 15
    [2] => 24
)
登入後複製
3.null合併運算子

由於日常使用中存在大量同時使用三元表達式和isset()的情況, 我們加入了null合併運算子(??) 這個語法糖。如果變數存在且值不為NULL, 它就會傳回自身的值,否則傳回它的第二個運算元。

<?php
// 如果$_GET[&#39;user&#39;]不存在就执行nobody赋值给$username
$username = $_GET[&#39;user&#39;] ?? &#39;nobody&#39;;
// 上面的语句相当于下面的语句
$username = isset($_GET[&#39;user&#39;]) ? $_GET[&#39;user&#39;] : &#39;nobody&#39;;
 
// Coalesces can be chained: this will return the first
// defined value out of $_GET[&#39;user&#39;], $_POST[&#39;user&#39;], and
// &#39;nobody&#39;.
$username = $_GET[&#39;user&#39;] ?? $_POST[&#39;user&#39;] ?? &#39;nobody&#39;;
?>
登入後複製
4.太空船運算子(組合比較子)

#太空船運算子用於比較兩個表達式。當$a小於、等於或大於$b時它分別回傳-1、0或1。比較的原則是沿用 PHP 的常規比較規則進行的。

<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
 
// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
登入後複製

5.透過 define() 定義常數數組

#Array 類型的常數現在可以透過 define() 來定義。在 PHP5.6 中僅能透過 const 定義。
<?php
define(&#39;ANIMALS&#39;, [
    &#39;dog&#39;,
    &#39;cat&#39;,
    &#39;bird&#39;
]);
 
echo ANIMALS[1]; // 输出 "cat"
?>
登入後複製

6.匿名類別

現在支援透過

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;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});
 
var_dump($app->getLogger());
?>
登入後複製
以上例程會輸出:
object(class@anonymous)#2 (0) {
}
登入後複製

7.Unicode codepoint 轉譯語法

這接受一個以16進位形式的Unicode codepoint,並列印出一個雙引號或heredoc包圍的UTF-8 編碼格式的字串。可以接受任何有效的 codepoint,並且開頭的 0 是可以省略的。

echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
登入後複製
以上程式會輸出:
ª
ª (same as before but with optional leading 0&#39;s)
香
登入後複製

8.

Closure::call()

Closure::call () 現在有著更好的效能,簡短幹練的暫時綁定一個方法到物件上閉包並呼叫它。

<?php
class A {private $x = 1;}
 
// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, &#39;A&#39;); // 中间层闭包
echo $getX();
 
// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
登入後複製

以上例程會輸出:

1
1
登入後複製

###9.unserialize()提供過濾#########這個特性旨在提供更安全的方式解包不可靠的數據。它透過白名單的方式來防止潛在的程式碼注入。 ###
// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);
 
// 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
 
// 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);
登入後複製
######10.IntlChar#########新增加的 IntlChar 類別旨在暴露出更多的 ICU 功能。這個類別本身定義了許多靜態方法用於操作多字元集的 unicode 字元。 ###
<?php
 
printf(&#39;%x&#39;, IntlChar::CODEPOINT_MAX);
echo IntlChar::charName(&#39;@&#39;);
var_dump(IntlChar::ispunct(&#39;!&#39;));
登入後複製
###以上例程會輸出:###
10ffff
COMMERCIAL AT
bool(true)
登入後複製

若要使用此类,请先安装Intl扩展

11.预期

预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。

老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

<?php
ini_set(&#39;assert.exception&#39;, 1);
 
class CustomError extends AssertionError {}
 
assert(false, new CustomError(&#39;Some error message&#39;));
?>
登入後複製

以上例程会输出:

Fatal error: Uncaught CustomError: Some error message
登入後複製

关于这个特性的完整说明,包括如何在开发和生产环境中配置它,可以在assert()的 expectations section章节找到。

12.Group use declarations

从同一 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};
?>
登入後複製

13.生成器可以返回表达式

此特性基于 PHP 5.5 版本中引入的生成器特性构建的。 它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

<?php
 
$gen = (function() {
    yield 1;
    yield 2;
 
    return 3;
})();
 
foreach ($gen as $val) {
    echo $val, PHP_EOL;
}
 
echo $gen->getReturn(), PHP_EOL;
登入後複製

以上例程会输出:

1
2
3
登入後複製

在生成器中能够返回最终的值是一个非常便利的特性, 因为它使得调用生成器的客户端代码可以直接得到生成器(或者其他协同计算)的返回值, 相对于之前版本中客户端代码必须先检查生成器是否产生了最终的值然后再进行响应处理 来得方便多了。

14.Generator delegation

现在,只需在最外层生成其中使用 yield from, 就可以把一个生成器自动委派给其他的生成器, Traversable 对象或者 array。

<?php
 
function gen()
{
    yield 1;
    yield 2;
 
    yield from gen2();
}
 
function gen2()
{
    yield 3;
    yield 4;
}
 
foreach (gen() as $val)
{
    echo $val, PHP_EOL;
}
 
?>
登入後複製

以上例程会输出:

1
2
3
4
登入後複製

15.整数除法函数 intdiv()

新加的函数 intdiv() 用来进行 整数的除法运算。

<?php
 
var_dump(intdiv(10, 3));
?>
登入後複製

以上例程会输出:

int(3)
登入後複製

16.会话选项

session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的 会话配置选项。

在调用 session_start() 的时候, 传入的选项参数中也支持 session.lazy_write 行为, 默认情况下这个配置项是打开的。它的作用是控制 PHP 只有在会话中的数据发生变化的时候才 写入会话存储文件,如果会话中的数据没有发生改变,那么 PHP 会在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改,可以通过设置 read_and_close 来实现。

例如,下列代码设置 session.cache_limiter 为 private,并且在读取完毕会话数据之后马上关闭会话存储文件。

<?php
session_start([
    &#39;cache_limiter&#39; => &#39;private&#39;,
    &#39;read_and_close&#39; => true,
]);
?>
登入後複製

17.preg_replace_callback_array()

在 PHP 7 之前,当使用 preg_replace_callback() 函数的时候, 由于针对每个正则表达式都要执行回调函数,可能导致过多的分支代码。 而使用新加的 preg_replace_callback_array() 函数, 可以使得代码更加简洁。

现在,可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值。

18.CSPRNG Functions

新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。

可以使用 list() 函数来展开实现了 ArrayAccess 接口的对象 ¶

在之前版本中,list() 函数不能保证 正确的展开实现了 ArrayAccess 接口的对象, 现在这个问题已经被修复。

19.其他特性

允许在克隆表达式上访问对象成员,例如: (clone $foo)->bar()。

PHP7.1新特性

1.可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null

<?php
 
function testReturn(): ?string
{
    return &#39;elePHPant&#39;;
}
 
var_dump(testReturn());
 
function testReturn(): ?string
{
    return null;
}
 
var_dump(testReturn());
 
function test(?string $name)
{
    var_dump($name);
}
 
test(&#39;elePHPant&#39;);
test(null);
test();
登入後複製

以上例程会输出:

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...
登入後複製

2.Void 函数

一个新的返回值类型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 ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

3.类常量可见性

<?php
class Sky8g
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
登入後複製

4.iterable伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable

<?php
function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}
登入後複製

5.多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}
登入後複製

6.list()现在支持键名

现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

<?php
$data = [
    ["id" => 1, "name" => &#39;Tom&#39;],
    ["id" => 2, "name" => &#39;Fred&#39;],
];
 
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
 
// [] style
["id" => $id1, "name" => $name1] = $data[0];
 
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}
 
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}
登入後複製

7.支持为负的字符串偏移量

现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]{}操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
登入後複製

以上例程会输出:

string (1) "e"
int(3)
登入後複製

PHP7.2新特性

1.新的对象类型

这种新的对象类型<span class="type">object</span>, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。

<?php
 
function test(object $obj) : object
{
    return new SplQueue();
}
 
test(new StdClass());
登入後複製

2.通过名称加载扩展

扩展文件不再需要通过文件加载 (Unix下以<em>.so</em>为文件扩展名,在Windows下以 <em>.dll</em> 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用, 也可以使用 <span class="function">dl()</span> 函数进行启用。

3.允许重写抽象方法(Abstract method)

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php
 
abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}
登入後複製

4.使用Argon2算法生成密码散列

Argon2 已经被加入到密码散列(password hashing) API (这些函数以 password_ 开头), 以下是暴露出来的常量:

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

5.新增 ext/PDO(PDO扩展) 字符串扩展类型

当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量:

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

这些常量通过PDO::PARAM_STR利用位运算OR进行计算:

<?php
 
$db->quote(&#39;über&#39;, PDO::PARAM_STR | PDO::PARAM_STR_NATL);
登入後複製

6.为 ext/PDO新增额外的模拟调试信息

<span class="function">PDOStatement::debugDumpParams()</span>方法已经更新,当发送SQL到数据库的时候,在一致性、行查询(包括替换绑定占位符)将会显示调试信息。这一特性已经加入到模拟调试中(在模拟调试打开时可用)。

7.ext/LDAP(LDAP扩展) 支持新的操作方式

LDAP 扩展已经新增了EXOP支持. 扩展暴露以下函数和常量:

  • <span class="simpara"><span class="function">ldap_parse_exop()</span></span>
  • <span class="simpara"><span class="function">ldap_exop()</span></span>
  • <span class="simpara"><span class="function">ldap_exop_passwd()</span></span>
  • <span class="simpara"><span class="function">ldap_exop_whoami()</span></span>
  • LDAP_EXOP_START_TLS
  • LDAP_EXOP_MODIFY_PASSWD
  • LDAP_EXOP_REFRESH
  • LDAP_EXOP_WHO_AM_I
  • LDAP_EXOP_TURN

8.ext/sockets(sockets扩展)添加了地址信息

sockets扩展现在具有查找地址信息的能力,且可以连接到这个地址,或者进行绑定和解析。为此添加了以下一些函数:

  • socket_addrinfo_lookup()
  • socket_addrinfo_connect()
  • socket_addrinfo_bind()
  • socket_addrinfo_explain()

9.扩展了参数类型

重写方法和接口实现的参数类型现在可以省略了。不过这仍然是符合LSP,因为现在这种参数类型是逆变的。

<?php
 
interface A
{
    public function Test(array $input);
}
 
class B implements A
{
    public function Test($input){} // type omitted for $input
}
登入後複製

10.允许分组命名空间的尾部逗号

命名空间可以在PHP 7中使用尾随逗号进行分组引入。

<?php
 
use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};
登入後複製

PHP7.3新特性

1.Unicode 11支持

多字节字符串数据表已更新为Unicode 11。

2.长字符串的支持

多字节字符串函数现在正确支持大于2GB的字符串。

3.性能改进

多字节字符串扩展的性能得到了全面的显著改善。最大的改进是大小写转换功能。

4.自定义命名了支持

mb_ereg_*函数现在支持命名捕捉。像mb_ereg()这样的匹配函数现在将使用它们的组号和名称返回指定的捕获,类似于PCRE:

<?php
mb_ereg(&#39;(?<word>\w+)&#39;, &#39;国&#39;, $matches);
// => [0 => "国", 1 => "国", "word" => "国"];
?>
登入後複製

另外,mb_ereg_replace()现在支持\k<>和\k "符号来引用替换字符串中的指定捕获:

<?php
mb_ereg_replace(&#39;\s*(?<word>\w+)\s*&#39;, "_\k<word>_\k&#39;word&#39;_", &#39; foo &#39;);
// => "_foo_foo_"
?>
登入後複製

\k<>和\k "也可用于编号引用,也可用于大于9的组号。

PHP7.4新特性

1.类型属性

类属性现在支持类型声明。

<?php
class User {
    public int $id;
    public string $name;
}
?>
登入後複製

上面的示例将强制执行$user->id只能赋给整数值,而$user->name只能赋给字符串值。

2.箭头函数

箭头函数为使用隐式按值范围绑定定义函数提供了一种简写语法。

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
登入後複製

3.限制返回类型和参数型逆变

<?php
class A {}
class B extends A {}
 
class Producer {
    public function method(): A {}
}
class ChildProducer extends Producer {
    public function method(): B {}
}
?>
登入後複製

只有在使用自动加载时,才可以使用全方差支持。在单个文件中,只有非循环类型引用是可能的,因为所有类在被引用之前都必须是可用的。

4.Null 合并赋值运算符

<?php
$array[&#39;key&#39;] ??= computeDefault();
// is roughly equivalent to
if (!isset($array[&#39;key&#39;])) {
    $array[&#39;key&#39;] = computeDefault();
}
?>
登入後複製

5.合并数组新方式

<?php
$parts = [&#39;apple&#39;, &#39;pear&#39;];
$fruits = [&#39;banana&#39;, &#39;orange&#39;, ...$parts, &#39;watermelon&#39;];
// [&#39;banana&#39;, &#39;orange&#39;, &#39;apple&#39;, &#39;pear&#39;, &#39;watermelon&#39;];
?>
登入後複製

6.数值文字分隔符

<?php
6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary
?>
登入後複製

7.弱引用

弱引用允许程序员保留对对象的引用,而不阻止对象被销毁。

如果有不懂的地方请留言,SKY8G网站编辑者专注于研究IT源代码研究与开发。希望你下次光临,你的认可和留言是对我们最大的支持,谢谢!

推荐学习:《PHP视频教程

以上是快速了解PHP7.X各版本的新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:sky8g
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板