ホームページ >バックエンド開発 >PHP7 >PHP5.5~PHP7.2の新機能を整理

PHP5.5~PHP7.2の新機能を整理

coldplay.xixi
coldplay.xixi転載
2021-03-23 10:19:302468ブラウズ

PHP5.5~PHP7.2の新機能を整理

PHP5.5 ~ PHP7.2 の新機能の配置

1. PHP 5.5.x から PHP 5.6.x への移行

式を使用して定数を定義する

#以前の PHP バージョンでは、静的な値を使用して定数を定義し、プロパティを宣言し、デフォルト値を指定する必要がありました。関数パラメータの場合。数値、文字列リテラル、その他の定数を含む数値式を使用して、定数の定義、プロパティの宣言、関数パラメーターのデフォルト値の設定を行うことができるようになりました。

<?php
const ONE = 1;
const TWO = ONE * 2;

class C {
    const THREE = TWO + 1;
    const ONE_THIRD = ONE / self::THREE;
    const SENTENCE = &#39;The value of THREE is &#39;.self::THREE;
}

const キーワードを使用して配列型の定数を定義できるようになりました。

<?php
const ARR = [&#39;a&#39;, &#39;b&#39;];

echo ARR[0];

.... 演算子を使用して可変長パラメーター関数を定義する

... 演算子に依存せずに使用できるようになりましたon func_get_args() 可変長パラメータ関数を実装します。

<?php
function f($req, $opt = null, ...$params) {
    // $params 是一个包含了剩余参数的数组
    printf(&#39;$req: %d; $opt: %d; number of params: %d&#39;."\n",
           $req, $opt, count($params));
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
?>

上記のルーチンは次の出力を行います:

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2

パラメータ拡張には ... 演算子を使用します

function... 演算子を使用すると、配列と走査可能なオブジェクトが関数パラメータに展開されます。 Ruby などの他のプログラミング言語では、これは連結演算子と呼ばれます。

<?php
function add($a, $b, $c) {
    return $a + $b + $c;
}

$operators = [2, 3];
echo add(1, ...$operators);
?>

上記のルーチンは次の出力を行います:

6

use function と use const

use 演算子は、クラスでのインポートをサポートするように拡張されました。外部関数と定数。対応する構造体は use function と use const です。

<?php
namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}
?>

上記のルーチンは次の出力を行います:

42
Name\Space\f

タイミング攻撃を避けるために hash_equals() を使用して文字列を比較します

推奨 (無料) : PHP7


##2. PHP 5.6.x から PHP 7.0 への移行.xx

スカラー型宣言

スカラー型宣言には、必須モード (デフォルト) と厳密モードの 2 つのモードがあります。 string、int、float、bool の型パラメータが (強制モードまたは厳密モードのいずれかで) 使用できるようになりました。

<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, &#39;3&#39;, 4.1));

上記のルーチンは次の出力を行います:

int(9)

戻り値の型宣言

PHP 7 では戻り値の型宣言のサポートが追加されました。パラメーターの型宣言と同様に、戻り値の型宣言では関数の戻り値の型を指定します。使用可能な型は、パラメータ宣言で使用できる型と同じです。

<?php

function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

null 合体演算子

日常の使用では三項式と isset() が同時に使用される状況が多数あるため、null 合体演算子 (

??) この糖衣構文。変数が存在し、NULL でない場合はそれ自体の値を返し、それ以外の場合は 2 番目のオペランドを返します。

<?php
// Fetches the value of $_GET[&#39;user&#39;] and returns &#39;nobody&#39; if it does not exist.
$username = $_GET[&#39;user&#39;] ?? &#39;nobody&#39;;
// This is equivalent to:
$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;;
?>

Spaceship 演算子 (結合比較演算子)

spaceship 演算子は、2 つの式を比較するために使用されます。 $a が $b より小さい場合、等しい場合、または $b より大きい場合は、それぞれ -1、0、または 1 を返します。比較の原則は、PHP の通常の比較ルールに従います。

<?php
// 整数
echo 1 <=> '1'; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// 浮点数
echo '1.50' <=> 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
?>

define() による定数配列の定義

配列型の定数を、define() によって定義できるようになりました。 PHP5.6 では const 経由でのみ定義できます。

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // 输出 "cat"

Closure::call()

Closure::call() のパフォーマンスが向上し、メソッドをオブジェクトに一時的にバインドする短く簡潔な方法になりました。 . パッケージ化して呼び出します。

<?php
class A {private $x = 1;}

// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();

// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
上記のルーチンは次の出力を行います:

1

Groupuse Statement

同じ名前空間からインポートされたクラス、関数単一の 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};
?>

ジェネレーターは式を返すことができます

この機能は、PHP 5.5 バージョンで導入されたジェネレーター機能に基づいて構築されています。ジェネレーター関数の return 構文を使用して、式を返すことができます (ただし、参照値を返すことはできません)。ジェネレーターの戻り値は、Generator::getReturn() メソッドを呼び出すことで取得できますが、このメソッドは、プロセッサが作業の生成を終了した後に Called を 1 回生成する場合にのみ使用できます。

#整数除算関数 intp()


PHP 7.0.x から PHP 7.1.x

に移植されました。 ##Null 可能な型

型の前に疑問符を追加することで、パラメーターと戻り値の型を null にすることができるようになりました。この機能が有効な場合、渡されるパラメーターまたは関数によって返される結果は、指定された型または 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...

Void 関数

新しい戻り値の型 void が導入されました。戻り値が void 型で宣言されているメソッドは、return ステートメントを完全に省略するか、空の return ステートメントを使用します。 NULL は、void 関数の正当な戻り値ではありません。

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

対称配列の構造化

短い配列構文 ([]) は list() として使用されるようになりました。構文の代わりに、配列の値を変数 (foreach に含まれる) に割り当てるために使用できます。

<?php
$data = [
    [1, &#39;Tom&#39;],
    [2, &#39;Fred&#39;],
];

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
    // logic here with $id and $name
}

クラス定数の可視性

クラス定数の可視性の設定がサポートされるようになりました。

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

iterable 伪类

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

<?php
function iterator(iterable $iter) : iterable
{
    foreach ($iter as $val) {
        //
    }
}

多异常捕获处理

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

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

list()现在支持键名

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

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// 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
}

从PHP 7.1.x 移植到 PHP 7.2.x

新的对象类型

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

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());

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

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

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;
}

扩展了参数类型

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

interface A
{
    public function Test(array $input);
}

class B implements A
{
    public function Test($input){} // type omitted for $input
}

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

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

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

以上がPHP5.5~PHP7.2の新機能を整理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。