PHP5.5 から PHP7.2 への新機能

藏色散人
リリース: 2023-02-17 11:38:02
転載
3592 人が閲覧しました


1. PHP 5.5.x から PHP 5.6 に移行します。xx

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

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 キーワードを使用して、 array 型の定数を定義できるようになりました。

<?php
const ARR = [&#39;a&#39;, &#39;b&#39;];
echo ARR[0];
ログイン後にコピー

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

現在、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
ログイン後にコピー

関数を呼び出すときは ... 演算子をパラメータ拡張に使用します

... 演算子を使用する場合、配列と走査可能なオブジェクトを関数パラメータに展開します。 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
ログイン後にコピー

Use

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

2. PHP 5.6 より.x PHP 7.0 に移植。x

スカラー型宣言

スカラー型宣言には、必須モード (デフォルト) と厳密モードの 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 <=> &#39;1&#39;; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮点数
echo &#39;1.50&#39; <=> 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(&#39;ANIMALS&#39;, [
    &#39;dog&#39;,
    &#39;cat&#39;,
    &#39;bird&#39;
]);
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, &#39;A&#39;); // 中间层闭包
echo $getX();
// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
ログイン後にコピー

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

1
ログイン後にコピー

グループ使用宣言

同じ

名前空間 からインポートされたクラス、関数、および定数をパススルーできるようになりました単一使用 ステートメントは一度にインポートされます。

<?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 回生成する場合にのみ使用できます。

整数除算関数 intdiv()

##3. 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)
Symmetric array destructuring
ログイン後にコピー

短い配列構文 ([]) は 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

<strong> 疑似クラス</strong>

现在引入了一个新的被称为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" => &#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
}
ログイン後にコピー

四、从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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート