この記事では、主に PHP7 の新機能に関する情報を紹介します。ここでは、新機能の学習と参照に役立つ詳細な情報と簡単な実装コードをまとめています。最近のプロジェクトではphp7をインストールしましたが、使用されていない新機能がたくさんあると感じています。使用できる可能性のあるいくつかの新機能を要約したいと思います。以前使用していた環境は php5.4 でした。php5.5 と php5.6 のすべての機能もまとめます。ここでは、プロジェクトで使用できると思われる機能のみをリストします。 PHPマニュアル。
ジェネレーター (PHP 5 >= 5.5.0、PHP 7)は、yield キーワードを追加することで、Iterator インターフェースを実装せずにイテレーターを実装する簡単な方法を提供します。
<?php function xrange($start, $limit, $step = 1) { for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } echo 'Single digit odd numbers: '; /* 注意保存在内存中的数组绝不会被创建或返回 */ foreach (xrange(1, 9, 2) as $number) { echo "$number "; }
一桁の奇数: 1 3 5 7 9
詳細クリックジェネレーター
try-catch は、finally をサポートするようになりました
foreach 制御構造は、list() 構造を介してネストされた配列を別の変数にデタッチできるようになりました。例:
<?php $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { echo "A: $a; B: $b\n"; } ?>
A: 1; B: 2
A: 3; B: 4
array_column
(PHP 5 >= 5.5.0, PHP 7)
array_column — 配列内の指定された列を返します
定数を定義するには式を使用します (PHP 5 >= 5.6.0、PHP 7)
以前の PHP バージョンでは、静的な値を使用する必要がありました定数を定義し、プロパティを宣言し、関数パラメータのデフォルト値を指定します。 数値、文字列リテラル、その他の定数を含む数値式を使用して、定数の定義、プロパティの宣言、関数パラメーターのデフォルト値の設定を行うことができるようになりました。
<?php const ONE = 1; const TWO = ONE * 2; class C { const THREE = TWO + 1; const ONE_THIRD = ONE / self::THREE; const SENTENCE = 'The value of THREE is '.self::THREE; public function f($a = ONE + self::THREE) { return $a; } } echo (new C)->f()."\n"; echo C::SENTENCE; ?>
THREEの値は3です
これで、constキーワードを通じて配列型の定数を定義できるようになりました。
<?php const ARR = ['a', 'b']; echo ARR[0]; ?>
上記のルーチンは出力します:
これで信頼できなくなりますfunc_get_args( ) では、... 演算子を使用して可変長パラメーター関数を実装します。 <?php
function f($req, $opt = null, ...$params) {
// $params 是一个包含了剩余参数的数组
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>
$req: 1; $opt: 0; パラメータの数: 0
$req: 1; $opt: 2; パラメータの数: 3
(PHP 5 >= 5.6.0、PHP 7)
関数を呼び出すときは、... 演算子を使用して配列と走査可能なオブジェクトを関数パラメーターに展開します。 Ruby などの他の
プログラミング言語
では、これは連結演算子と呼ばれます。
<?php function add($a, $b, $c) { return $a + $b + $c; } $operators = [2, 3]; echo add(1, ...$operators); ?>
6
use function と use const (PHP 5 >= 5.6.0, PHP 7)
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
debugInfo() (PHP 5 >= 5.6.0, PHP 7)
<?php class C { private $prop; public function construct($val) { $this->prop = $val; } public function debugInfo() { return [ 'propSquared' => $this->prop ** 2, ]; } } var_dump(new C(42)); ?>
object(C)#1 (1) { ["propSquared"]=> int(1764) }
コールバック型
) を拡張します。<?php // Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
strict モードを使用するには、declare 宣言ディレクティブをファイルの先頭に配置する必要があります。これは、スカラーがファイル ベースで構成可能であると厳密に宣言されていることを意味します。 このディレクティブは、パラメーターの型宣言だけでなく、関数の戻り値の宣言にも影響します (戻り値の型宣言、組み込み PHP 関数、拡張機能にロードされる PHP 関数を参照)
戻り値の型宣言 (PHP) 7)
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
)
null マージ演算子 (PHP 7) )
由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
<?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'; ?>
太空船操作符(组合比较符)(PHP 7)
太空船操作符用于比较两个表达式。当$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() 定义常量数组 (PHP 7)
Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。
<?php define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // outputs "cat" ?>
匿名类 (PHP 7)
现在支持通过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) {
}
Closure::call() (PHP 7)
Closure::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 7)
这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。
<?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]);
Group use declarations (PHP 7)
从同一 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}; ?>
以上がPHP7 の新機能の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。