はじめに
こんにちは。
GMOアドマーケティングのK.Kです。
前回のPHP7.2の記事に引き続き、今回はPHP7.3の変更点に関して掻い摘んでご紹介させて頂きます。
(引用元|https://secure.php.net/download-logos.php)
目次
- PHP7.3に関して
- 新機能
2-1. 関数の引数の末尾にコンマを許可 - 新しく追加された関数
3-1. array_key_first(), array_key_last()
3-2. hrtime()
3-3. is_countable() - 下位互換性のない変更点, 推奨されなくなる機能
4-1. フレキシブルなヒアドキュメント
4-2. switch構文内でのcontinue
4-3. 大文字と小文字を区別しない定数
4-4. 文字列以外のNeedleを文字列で検索する
4-5. フィルタリングのフラグ - その他
5-1. 定数JSON_THROW_ON_ERRORの追加
5-2. setcookie()でSameSite属性をサポート - 最後に
PHP7.3に関して
PHP7.3は2018年12月6日にリリースされました。
マイナーバージョンアップではありますが、ヒアドキュメントや新しく追加された関数など、実用性のある変更がありました。
今回はそれらPHP7.3の変更点に関して一部を紹介させて頂きます。
新機能
関数の引数の末尾にコンマを許可
PHP7.2までは配列の最後の要素にコンマ「,」が許可されていましたが、PHP7.3からは関数の引数でも「,」が許可されるようになります。
引数の追加や削除がより便利になりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php function sum(int $a, int $b, int $c): int { return $a + $b + $c; } // 関数引数 $parameter = sum( 1, 2, 3, // 7.3から許可 ); // 配列 $array = [ 'a', 'b', 'c', // 以前から許可 ]; var_dump($parameter); // 7.2環境 PHP Parse error: syntax error, unexpected ')' // 7.3環境 int(6) var_dump($array); //array(3) { // [0]=> // string(1) "a" // [1]=> // string(1) "b" // [2]=> // string(1) "c" //} |
新しく追加された関数
array_key_first(), array_key_last()
名前の通り、array_key_first()は配列の最初のキーを、array_key_last()は配列の最後のキーを返します。
array_keys()や、key()での取得より便利になりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $array = [ 'a' => '1', 'b' => '2', 'c' => '3', ]; $first_key = array_key_first($array); $last_key = array_key_last($array); var_dump($first_key); var_dump($last_key); // string(1) "a" // string(1) "c" |
hrtime()
任意の時間からの経過時間を高解像度時間で取得する。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php var_dump(hrtime(true)); // ナノ秒 var_dump(hrtime(false)); // ['秒部分', 'ナノ秒部分'] // int(35122083244475) // array(2) { // [0]=> // int(35122) // [1]=> // int(83270458) // } |
is_countable()
引数がcount()できるか調べることができます。
PHP7.2への変更の時に配列およびCountableインターフェースを実装したオブジェクト以外をcount()で数えようとするとwarningが出るようになりました。そのためis_array()などでチェックする必要がありましたが、PHP7.3からはis_countable()で解決できそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php var_dump(is_countable(null)); var_dump(is_countable(1)); var_dump(is_countable('abc')); var_dump(is_countable([1, 2, 3])); var_dump(is_countable(new stdClass())); var_dump(is_countable(new ArrayIterator())); // bool(false) // bool(false) // bool(false) // bool(true) // bool(false) // bool(true) |
下位互換性のない変更点, 推奨されなくなる機能
フレキシブルなヒアドキュメント
PHP7.3では「””」で括られた文字列と同様に動作するヒアドキュメント、
「”」で括られた文字列と同様に動作するnowdocに関してアップデートがありました。
PHP7.2までは終端IDがある行には「;」以外の文字が含まれてはならないかつ、最後の区切り文字の後にも改行が必要でした。
PHP7.3からは終端IDがインデントできるようになり、終端IDがインデント位置が行頭になります。
そのため、文字列内に終端IDと同じ文字列があるとエラーになる恐れがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php // インデントで合わせることができるようになり、終端IDの後の改行が不要となりました。 if (1 > 0) { $str1 = <<<HOGE Hello World HOGE; } var_dump($str1); // 7.2環境 //PHP Parse error: syntax error // 7.3環境 //string(11) "Hello //World" // 文字列内に終端IDと同じ文字列があるとエラーになることがあります $str2 = <<<HUGA Hello HUGA HUGA; var_dump($str2); // 7.2環境 //string(14) "Hello // HUGA" // 7.3環境 //PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 4) |
switch構文内でのcontinue
PHP7.2まではswitch構文内でcontinueはbreakと同じ挙動をしていました。
PHP7.3からはwarningが出るようになります。またPHP8ではerrorになるようです。
1 2 3 4 5 6 7 8 9 10 |
<?php while ($hoge) { switch ($hoge) { case 'test': continue; } } // 7.3環境 PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? |
大文字と小文字を区別しない定数
define()では第3引数でTRUEを指定すると定数は大文字小文字を区別しないようになりますが、これが非推奨となります。
1 2 3 4 5 6 7 8 |
<?php define('HOGE', 1, true); var_dump(hoge); // 7.2環境 int(1) // 7.3環境 PHP Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "HOGE" |
文字列以外のNeedleを文字列で検索する
strpos()などの文字列検索関数に対し、検索したい文字列(Needle)に非文字列を渡すことが非推奨となります。
1 2 3 4 5 6 7 8 9 10 |
<?php $string = 'hoge'; $needle = 1; var_dump(strpos($string, $needle)); // 7.2環境 bool(false) // 7.3環境 PHP Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior // bool(false) |
フィルタリングのフラグ
URLを厳密に検証されていることを確認するための2つのフラグが非推奨になります。
FILTER_FLAG_SCHEME_REQUIRED(URLスキーム), FILTER_FLAG_HOST_REQUIRED(URLホスト)
1 2 3 4 5 6 7 |
<?php var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)); // 7.2環境 string(18) "http://example.com" // 7.3環境 PHP Deprecated: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated // string(18) "http://example.com" |
その他
定数JSON_THROW_ON_ERRORの追加
json_decode(), json_encode()のオプションで利用できる定数JSON_THROW_ON_ERRORが追加されました。
これによりjson_decode(), json_encode()でエラーが発生するとJsonExceptionが発生するようになります。
json_decode()はデコードに失敗した時などの場合、NULLを返しますが、json_decode(null)はNULLを返しますので、分かりづらい仕様でしたが、このオプションにより回避できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php try { var_dump(json_decode("{", true, 512, JSON_THROW_ON_ERROR)); } catch (JsonException $e) { var_dump($e->getMessage()); } // 7.2環境 //PHP Warning: Use of undefined constant JSON_THROW_ON_ERROR - assumed 'JSON_THROW_ON_ERROR' //PHP Warning: json_decode() expects parameter 4 to be integer, string given //NULL // 7.3環境 //string(12) "Syntax error" |
setcookie()でSameSite属性をサポート
CookieのSameSite属性は、Cookieを発行する際にSameSite属性を指定しておけばクロスドメインのリクエストにCookieをセットするかどうかを指定できますが、
PHP7.3からはsetcookie()とsetrawcookie()のオプションで指定できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php setcookie( 'hoge', 'huga', [ 'expires' => 3600, 'path' => '/', 'secure' => true, 'domain' => 'test.com', 'httponly' => true, 'samesite' => 'Strict', // ←追加 ] ); |
最後に
今回もPHPのバージョンに関して一部紹介の記事を書かせて頂きました。
新機能や廃止されてく機能を知ることは単純な感想になりますが、面白いですし、コーディングなど他にも活かしていけそうです。
今後もPHPの情報をキャッチアップして、発信できていければと思います。
GMOアドマーケティングではPHPエンジニアを募集しています。
興味がある方は以下のページをご覧ください。
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~