【翻訳】PHP 7——新特性


原文の住所:http://php.net/manual/zh/migration70.new-features.php
新しい特性
スカラー型宣言
スカラータイプ宣言には、強制(デフォルト)と厳格なモードがあります.以下のタイプのパラメータ(強制モードでも厳密モードでも)が使用されます.文字列(string)、整数(int)、浮動小数点(float)、ブール値(boll).これらはPHP 5に導入された他のタイプを拡充しています.クラス名、インターフェース、配列とコールバックのタイプです.
<?php
// Coercive mode
function sumOfInts(int ...$ints) {
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));
上記のルーチンは出力されます.
int(9)
厳格なモードを使用するには、declare命令はファイルの上部に置かなければなりません.これは、厳密なスカラーの宣言が、ファイルの割り当て可能性に基づいていることを意味する.このコマンドはパラメータのタイプ宣言だけでなく、関数の戻り値宣言にも影響を及ぼします.(戻り値タイプ宣言、内蔵のPHP関数、拡張中のPHP関数を参照してください.)
完全なスカラタイプの宣言ドキュメントと例は、タイプ宣言セクションを参照してください.
戻り値タイプ宣言
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
)
完全なスカラタイプ宣言ドキュメントおよび例は、返却値タイプ宣言を参照してください.
null結合演算子
日常的な使用には大量の三元表現とisset()を同時に使う場合がありますので、null結合演算子(?)という文法飴を追加しました.変数が存在し、値がNULLでない場合は、自身の値を返します.そうでなければ、その2番目の操作数を返します.
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalesces can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
宇宙船オペレータ(組み合わせ比較子)
宇宙船オペレータは2つの表現を比較するために使用されます.aが大きいか等しいか、またはbより小さい場合、それぞれ-1、0または1を返します.比較の原則はPHPの従来の比較規則を踏襲して行う.
<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
define()で定数配列を定義します.
Arayタイプの定数は現在definedefine()で定義されています.PHP 5.6ではconstでのみ定義できます.
<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // outputs "cat"
?>
匿名クラス
今は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) {
}
詳細文書は匿名クラスを参照できます.
Unicodepoint変換文法
これは16進数でUnicodepointを受け付け、ダブルクォーテーションまたはheedocで囲まれたUTF-8符号化フォーマットの文字列をプリントします.任意の効果的なcodepointを受け入れることができ、先頭の0は省略することができます.
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
上記のルーチンは出力されます.
ª
ª (same as before but with optional leading 0's)
 
Cloure:call()
Close::call()はより良い性能を持っています.短くて洗練された一時的なバインディング方法はオブジェクトに閉じて呼び出します.
<?php
class A {private $x = 1;}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);
上記のルーチンは出力されます.
1
1
unserialize()にフィルタを提供します.
この特性は、より安全な方法で信頼性のないデータをパケット解除することを目的とする.これはホワイトリスト方式で潜在的なコード注入を防止します.
<?php

// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);

// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);
Intl Char
新たに増加したIntl Charクラスは、より多くのICU機能を露出することを目的としている.このクラス自体は、多文字セットのunicode文字を操作するための多くの静的方法を定義している.
<?php printf('%x', IntlChar::CODEPOINT_MAX); echo IntlChar::charName('@'); var_dump(IntlChar::ispunct('!'));
上記のルーチンは出力されます.
10ffff
COMMERCIAL AT
bool(true)
このような使い方をするなら、まずIntl拡張をインストールしてください.
予想する
後方兼用で強化する前のクラスメイト()の方法が期待されます.生産環境においてゼロコストと断言し、失敗と断言したときに特定の異常を投げ出す能力を提供する.
古いバージョンのAPIは互換性のある目的で維持され続けます.astert()は現在言語構造です.最初のパラメータは式であり、計算されるべきstringやテスト待ちのbollanだけではありません.
<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Some error message'));
?>
上記のルーチンは出力されます.
Fatal error: Uncaught CustomError: Some error message
この特性の完全な説明については、開発と生産環境にどのように配置するかを含め、astert()のexpectations sectionの章で見つけることができます.
Group use declarations
同じnamespaceから導入されたクラス、関数、定数は現在単一のuse文で一気に導入できます.
<?php

// Pre PHP 7 code
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+ code
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};
?>
Generator Return Expressions
この機能はPHP 5.5発電機を導入する機能です.これは、最終的な表現のために、発電機内で使用するためにreturn文を返すことができます.この値は新しい発電機を使用することができます.
<?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
発電機から最終値を明確に返すことができるのは便利な能力です.これは、発電機によって返される(あるいは何らかの形の協働から計算する)ために、発生器の顧客コードを実行することによって、具体的に処理される最終値を使用するからです.これは、クライアントコードに強制されるよりも、最初に最終値が発生しているかどうかを確認し、その後、そうであれば、この値を処理するのが簡単である.
Generator delegation
発電機は現在、他の発生器に委託してもいいです.自動的にオブジェクトや配列を変位させます.構造からの降伏を用いて、試料を作成して、一番外側にある発電機を編む必要がありません.
<?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
Integer division with intdiv()
新しいintdiv()関数で実行される演算数の整数除算を返します.
<?php var_dump(intdiv(10, 3)); ?>
上記のルーチンは出力されます.
int(3)
Session options
セッションにstart()は、現在受け付けているオプションで、php.iniに通常設定されているセッション設定コマンドの配列をカバーします.
これらのオプションも拡張され、session.lazyをサポートします.write、これはデフォルトでPHPが任意のセッションファイルだけをカバーしている場合、セッションデータが変更された場合、read_and_close、これはsessionにしか伝えられないです.会話のデータを読むべきであることを示すためにstart()のオプションを選択して、会議はすぐに閉じるべきです.
例えば、session.cache_にします.limiterをプライベートに設定し、すぐに読んでセッションを終了します.
<?php
session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);
?>
preg_replace.カルバックarray()
新しいpreg_replace.カルバックarray()関数によりコード作成をよりクリーンにpreg_を使用します.replace.カルバック関数の場合.これに先立ちPHP 7は、各正規表現の反転が必要であり、調整関数が汚染され、多くの分岐があります.
ここでは、反転は、関連する配列を使用して登録できます.ここで最も重要なのは、正規表現の値は、各正規表現に対して調整されます.
CSPRNG Funtions
二つの新しい機能が、暗号化された安全な整数と文字列を生成するクロスプラットフォームに追加されました.bytes()とラドm_int()
list()can always unpack object s implementing ArayAccess
これまでリスト()は、ArayAccessオブジェクトの正常な動作を保証することができませんでした.これは修復されました.