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 = 'The value of THREE is '.self::THREE; }
これで、 const
キーワードを使用して、 array
型の定数を定義できるようになりました。
<?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); ?>上記のルーチンは次の出力を行います:
$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 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\fUse
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, '3', 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['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'; ?>
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グループ使用宣言 同じ
名前空間 からインポートされたクラス、関数、および定数をパススルーできるようになりました単一使用 ステートメントは一度にインポートされます。
<?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()
## への移行 #Null 可能な型
型の前に疑問符を追加することで、パラメーターと戻り値の型を Null 可能にできるようになりました。この機能が有効な場合、渡されるパラメーターまたは関数によって返される結果は、指定された型または null のいずれかになります。
<?php function testReturn(): ?string { return 'elePHPant'; } var_dump(testReturn()); function testReturn(): ?string { return null; } var_dump(testReturn()); function test(?string $name) { var_dump($name); } test('elePHPant'); 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, 'Tom'], [2, 'Fred'], ]; // 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" => '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 サイトの他の関連記事を参照してください。