PHP7の新機能


1. コア

  • グループ使用構文ステートメントを追加しました。 RFC: https://wiki.php.net/rfc/group_use_declarations
  • null 合体演算子を追加しました??。 RFC: https://wiki.php.net/rfc/isset_ternary
  • 64 ビット PHP7 文字列の長さは 2^31 バイトを超える可能性があります。
  • Closure::call() メソッドを追加しました。
  • 二重引用符で囲まれた文字列とヒアドキュメントでは、\u{xxxxx} を使用した Unicode 文字の宣言がサポートされています。
  • define() は配列を定数として定義できます。
  • マージ比較演算子 <=> を追加しました。 RFC: https://wiki.php.net/rfc/combined-comparison-operator
  • 演算子からの利回りを追加しました。 https://wiki.php.net/rfc/generator-delegation
  • キーワードは特定のシナリオでも使用できます。 RFC: https://wiki.php.net/rfc/context_sensitive_lexer
  • スカラー型宣言関数を追加しました。 RFC: https://wiki.php.net/rfc/scalar_type_hints_v5
  • ユーザー層に安全で便利な乱数生成器を提供するインターフェースを追加しました。 RFC: https://wiki.php.net/rfc/easy_userland_csprng


# ①PHP スカラー型と戻り値の型宣言

スカラー型宣言

Default 、すべて PHPファイルは弱い型チェック モードになっています。

PHP 7 では、スカラー型宣言の機能が追加されました。スカラー型宣言には 2 つのモードがあります:

  • 強制モード (デフォルト) 厳密モード

  • Strict モード

スカラー型宣言構文形式:

declare(strict_types=1);

コード内で strict_types の値 (1 または 0) を指定すると、1 は関数呼び出しと return ステートメントに適用される厳密な型チェック モードを示し、0 は弱い型チェック モードを示します。

使用できる型パラメータは次のとおりです:

  • #int

  • ##float
  • bool
  • string
  • interfaces
  • array
  • callable
Force モードの例:

<?php
// 强制模式
function sum(int ...$ints)
{
   return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
上記のプログラムの実行出力は次のとおりです:

9

例の要約は次のようになります。パラメータ 4.1 は整数 4 に変換されて加算されます。

Strict モードの例:

<?php
// 严格模式
declare(strict_types=1);

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(2, '3', 4.1));
?>
上記プログラムは strict モードを採用しているため、パラメータに不適切な整数型が出現するとエラーが報告され、実行が中断されます。出力結果は次のとおりです。

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


戻り値の型宣言PHP 7 では、戻り値の型宣言のサポートが追加されています。 function return 値の型。

宣言できる戻り値の型は次のとおりです:

    #int
  • ##float
  • bool
  • string
  • interfaces
  • array
  • callable
  • 戻り値の型宣言の例:

例では、戻り結果は整数である必要があります:

<?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 + 1.0;
}

print(returnIntValue(5));
?>

上記プログラムは strict モードを採用しているため、戻り値は int である必要がありますが、計算結果は float であるため、エラーが報告されます。実行出力結果は、

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
となります。

②PHP NULL マージ演算子

PHP 7 で新たに追加された NULL マージ演算子 (??) は、三項演算を実行するためのショートカットであることが検出されましたisset() によって。

NULL 合体演算子は、変数が存在し、値が NULL ではないかどうかを判断します。存在する場合は独自の値を返し、そうでない場合は 2 番目のオペランドを返します。

以前は三項演算子を次のように記述していました:

$site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网';

今では次のように直接記述できます:

$site = $_GET['site'] ?? 'PHP中文网';

Example

<?php
// 获取 $_GET['site'] 的值,如果不存在返回 'PHP中文网'
$site = $_GET['site'] ?? 'PHP中文网';

print($site);
print(PHP_EOL); // PHP_EOL 为换行符

// 以上代码等价于
$site = isset($_GET['site']) ? $_GET['site'] : 'PHP中文网';

print($site);
print(PHP_EOL);
// ?? 链
$site = $_GET['site'] ?? $_POST['site'] ?? 'PHP中文网';

print($site);
?>

上記プログラムの実行出力は次のとおりです:

PHP中文网
PHP中文网
PHP中文网

##③PHP 宇宙船演算子 (結合比較演算子)

PHP 7 に新しく追加された spaceship 演算子 (結合比較演算子) は、2 つの式 $a と $b を比較するために使用されます。$a が $b より小さい、等しい、または大きい場合、-1 を返します。それぞれ 0 または 1。

#例

<?php
// 整型比较
print( 1 <=> 1);print(PHP_EOL);
print( 1 <=> 2);print(PHP_EOL);
print( 2 <=> 1);print(PHP_EOL);
print(PHP_EOL); // PHP_EOL 为换行符

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

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

##上記のプログラムの実行出力は次のとおりです:

0
-1
1

0
-1
1

0
-1
1

④PHP 定数配列PHP 5.6 では、定数配列は const を介してのみ定義できますが、PHP 7 では、定数配列を定義できます。定義するには、define() を使用します。

#例

<?php// 使用 define 函数来定义数组define('sites', [
   'Google',
   'PHP',
   'Taobao']);print(sites[1]);?>
上記のプログラムの実行出力は次のとおりです:
PHP

##⑤PHP Closure::call()

PHP 7 の Closure::call() はパフォーマンスが向上し、クロージャ関数を新しいオブジェクト インスタンスに動的にバインドし、関数。


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

// PHP 7 之前版本定义闭包函数代码
$getXCB = function() {
    return $this->x;
};

// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A'); 

echo $getX();
print(PHP_EOL);

// PHP 7+ 代码
$getX = function() {
    return $this->x;
};
echo $getX->call(new A);
?>
上記のプログラムの実行出力は次のとおりです:
1
1

⑥PHP CSPRNG

#CSPRNG (Cryptographically Secure Pseudo-Random Number Generator、擬似乱数生成器)。

PHP 7 は、いくつかの CSPRNG 関数を導入することにより、暗号的に強力な乱数を生成するためのシンプルなメカニズムを提供します。

  • random_bytes() - 暗号的に保護された擬似ランダム文字列。

  • random_int() - 暗号的に保護された擬似乱数整数

random_bytes()

構文形式

string random_bytes ( int $length )

#パラメータ

  • length - ランダムな文字列によって返されるバイト数。

#戻り値

    文字列を返し、表す int 型の入力パラメータを受け入れます。結果として返されるバイト数。

#例

<?php
$bytes = random_bytes(5);
print(bin2hex($bytes));
?>
上記の実行出力プログラムは :
6f36d48a29

random_int()

##構文形式

int random_int ( int $min , int $max )
Parameters

min - 返される最小値は、PHP_INT_MIN 以上である必要があります。

  • max - 返される最大値は、 PHP_INT_MAX 以下である必要があります。

  • #戻り値

指定された範囲内の int 数値を返します。

  • #例

<?php
print(random_int(100, 999));
print(PHP_EOL);
print(random_int(-1000, 0));
?>

上記のプログラムの実行出力は次のとおりです:

723
-64

##⑦PHP 匿名クラス


PHP 7 は、新しいクラスによる匿名クラスのインスタンス化をサポートしています。これは、一部の「使用後の書き込み」を置き換えるために使用できます。 " " の完全なクラス定義。
<?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("我的第一条日志");
?>
上記のプログラムの実行出力は次のとおりです:
我的第一条日志

⑧PHP 7 use ステートメント


PHP 7 では、同じ名前空間からクラス、関数、定数をインポートするために use を使用できます:
// PHP 7 之前版本需要使用多次 use
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 导入同一个 namespace 的类
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};
?>
2.Opcache module
  • ファイルベースのセカンダリ オペコード キャッシュ メカニズムを追加しました。 php.ini ファイルで opcache.file_cache=<DIR> を設定できます。サービスが再起動されるか、SHM がリセットされる場合、セカンダリ ファイル キャッシュ メカニズムを使用するとパフォーマンスが向上する可能性があります。
  • opcache.file_cache_only=1 を設定して、ファイル キャッシュの使用のみを制限することもできます。
  • opcache.file_cache_consistency_checks=0 パラメータを設定すると、読み込みを高速化できます。
  • opcache.huge_code_pages=0/1 を設定すると、PHP コード ページをヒュージ ページに配置するかどうかを決定できます。 http://www.laruence.com/2015/10/02/3069.html
  • Windows バージョンでは、opcache.file_cache_fallback=1 構成項目が追加されます。

3. OpenSSL モジュール

「alpn_protocols」オプションを追加しました。

4. Reflection

  • ReflectionGenerator クラスは、トレース、現在のファイル/行などからの出力のために追加されます。
  • 新しい戻り値とスカラー宣言関数のサポートを強化するために、ReflectionType クラスが追加されました。

5. ストリーミング

Windows バージョンでは、ブロック読み取りのオプションが追加されています。 array("pipe" => array("blocking" => true)) パラメータを渡すことでアクティブ化できます。