ホームページ >バックエンド開発 >PHPチュートリアル >php7 の新しいスカラー、演算子、および戻り値の型機能の詳細な説明
1. ?? 演算子 (NULL 結合演算子)
$a = $_GET['a'] ?? 1;
と同等です:
$a = empty($_GET['a']) ? 1 : $_GET['a'];
三項演算子演算子は次のように使用できることがわかっています:
$a ?: 1
ただし、これはすでに $a に基づいています。定められた前提の上で。新しい ?? 演算子により判断が簡略化されます。コードが簡素化され、同時により直感的になりました。
公式ドキュメントで提供されている例 (...
の辺の長さパラメーターの構文は PHP 5.6 以降でのみ使用できることに注意してください): ...
的边长参数语法在 PHP 5.6 以上的版本中才有):
<?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]));
从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。
这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。
不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types
,既使用严格模式。
使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError
的 Fatal error。
强制模式:
<?php function foo($a) : int { return $a; } foo(1.0);
以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。
严格模式:
<?php declare(strict_types=1); function foo($a) : int { return $a; } foo(1.0);
在声明之后,就会触发致命错误。
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6
PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array
或者 callable
(PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string
、int
、float
和 bool
了。
<?php // Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError
的致命错误。
PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:
<?php 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};
但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import *
的方法)。
需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。
再来简单说几个:
1、PHP 5.3 开始有了匿名函数,现在又有了匿名类了;
2、define 现在可以定义常量数组;
3、闭包( Closure)增加了一个 call 方法;
4、生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from
的新语法进入一个另外一个生成器中(生成器委托)。
生成器的两个新特性(return 和 yield from
rrreee
strict_types
が追加されています。 🎜🎜戻り値の型宣言を使用する場合、厳密モードで宣言されていない場合、戻り値が期待される型でない場合でも、PHP はそれに対してキャスト型変換を実行します。ただし、厳密モードの場合、TypeError
の致命的エラーがトリガーされます。 🎜🎜強制モード: 🎜rrreee🎜 上記のコードは正常に実行でき、foo 関数はエラーなしで int 1 を返します。 🎜🎜厳密モード: 🎜rrreee🎜宣言後、致命的なエラーがトリガーされます。 🎜rrreee🎜3. スカラー型宣言🎜🎜 PHP 7 の関数の仮パラメータ型宣言はスカラーにすることができます。 PHP 5 では、クラス名、インターフェイス、array
、または callable
のみを指定できます (PHP 5.4 では、匿名関数を含む関数も指定できます)。 string
、int
、float
、および bool
を使用します。 🎜rrreee🎜上記の厳密モードの問題がここでも適用されることに注意してください。強制モード (デフォルトでは強制型変換) では、厳密モードの期待を満たさないパラメーターに対しても強制型変換が実行されます。場合、TypeError
の致命的エラーが発生します。 🎜🎜4. バッチ宣言を使用する🎜🎜 PHP 7 では、複数のクラス、関数、または const を 1 つの文で宣言できます: 🎜rrreee🎜 ただし、依然として各クラス、関数、または const の名前を書き出す必要があります (Python とは異なります)。一部の import * メソッドの と同じです)。 🎜🎜注意する必要がある質問は、composer と PSR-4 に基づくフレームワークを使用している場合、この記述方法でクラス ファイルを正常にロードできるかということです。実際、composer によって登録された<a href="http://www.php.cn/php/php-tp-upload.html" target="_blank">自動読み込みメソッドは、クラスがクラスの </a><a href="http://www.php.cn/wiki/220.html" target="_blank"> 名前空間 🎜 に従って場所を見つけます。この書き方は影響しません。 。 🎜🎜もう少し簡単に説明しましょう: 🎜🎜1. PHP 5.3 には匿名関数が追加されました。🎜🎜2. クロージャが追加されました。メソッド; 🎜🎜4. ジェネレーター (またはイテレーターのほうが適切です) は最終的な戻り値 (return) を持つことも、<code>yield from
(ジェネレーター デリゲート) の新しい構文を通じて別のジェネレーターに入ることができます。 🎜🎜ジェネレーターの 2 つの新しい機能 (return と yield from
) を組み合わせることができます。詳細については、ご自身でテストしてください。 🎜以上がphp7 の新しいスカラー、演算子、および戻り値の型機能の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。