Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHP勉強会@東京 (第148回) - PHP 7 系と PHP 8 系の違いをラッパー関数を...
Search
Mikumo
February 01, 2023
Programming
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP勉強会@東京 (第148回) - PHP 7 系と PHP 8 系の違いをラッパー関数を作って確認する
Mikumo
February 01, 2023
More Decks by Mikumo
See All by Mikumo
PHP勉強会@東京 (第149回) - 『範囲』について
mainy
0
390
Qiita Night PHP - エラーメッセージを読んでエラーを解決する
mainy
0
92
PyCon JP 2022 - Playwright で高機能ブラウザテスト
mainy
0
610
PHP Conference Japan 2022 - 背景色を基に見やすい文字色を自動で選択させるために WCAG ガイドラインを使う
mainy
0
670
PHPerKaigi 2022 - LT - 【視聴者参加型】 PHP この記号はなんでしょう?
mainy
0
620
Other Decks in Programming
See All in Programming
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.7k
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.2k
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
280
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
270
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
250
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
6
1.9k
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.3k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
110
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
110
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
500
How STYLIGHT went responsive
nonsquared
100
6.3k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Skip the Path - Find Your Career Trail
mkilby
1
230
Exploring anti-patterns in Rails
aemeredith
4
510
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
690
We Are The Robots
honzajavorek
0
370
Transcript
@maikeru (mikumo) PHP 7 系と PHP 8 系の違いを ラッパー関数を作って確認する
@maikeru (mikumo) 自己紹介✍ 三雲 勇二 / mikumo プライム・ストラテジー株式会社 所属 ・KUSANAGI
/ WEXAL (WordPress などフレームワーク高速化) ・ハイパーオートメーション (自動化やAIなど) ・PRIME STUDY (PHPの模擬試験あります) PHP技術者認定機構 エバンジェリスト ・PHP試験のコラムを毎月書いてます ・来年春公開予定の新試験「PHP8初級」の監修
@maikeru (mikumo) PHP 7 系のサポートが切れ 1ヶ月たちましたね
@maikeru (mikumo) PHP バージョン別シェア § W3Techs: https://w3techs.com/technologies/details/pl-php
@maikeru (mikumo) ですよね😶
@maikeru (mikumo) ということで、 PHP 8 系への移行は まだまだ残っています
@maikeru (mikumo) 暫定対応でよく使う方法として ラッパー関数を用意する手法 があります。
@maikeru (mikumo) implode 関数の ラッパー関数を作って 違いを見てみましょう。
@maikeru (mikumo) 今回の環境です。 動作環境: PHP 8.2 エミュレート: PHP 7.4
@maikeru (mikumo) implode 関数 § PHP Documentation: https://www.php.net/manual/ja/function.implode.php
@maikeru (mikumo) implode 関数 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php 1. implode(string
$separator, array $array): string 2. implode(array $array): string 3. implode(array $array, string $separator): string
@maikeru (mikumo) implode 関数の PHP 8.0 変更点 § PHP Documentation:
https://www.php.net/manual/ja/migration80.incompatible.php ($pieces, $glue) のような形で、 implode() 関数を逆の引数の順番で呼ぶ ことはサポートされなくなりました。
@maikeru (mikumo) implode 関数 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php 1. implode(string
$separator, array $array): string 2. implode(array $array): string 3. implode(array $array, string $separator): string 3番目の書き方は PHP 8.0 で廃止
@maikeru (mikumo) つまり、 引数の順番が間違っていたら 入れ替えれば良いのね😃
@maikeru (mikumo) implode ラッパー関数 function php74_implode($separator, $array) { // implode($array,
$separator) 対応 if (is_string($array) && is_array($separator)) { return implode($array, $separator); } return implode($separator, $array); }
@maikeru (mikumo) できたー😃
@maikeru (mikumo) いいえ 残念ながらコレではダメです🤔
@maikeru (mikumo) 問題 1 : 引数の型 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php
PHP 7 系までは引数の型は特に指定されていません。 implode($separator, $array) PHP 8 系は引数の型がチェックされるように書いています。 (が、実はそうでもないです。) implode(string $separator, array $array): string
@maikeru (mikumo) 問題 2 : 戻り値の型 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php
PHP 7 系までは戻り値の型が指定されていません。 implode($separator, $array) PHP 8 系は戻り値の型が指定されます。 (が、実はそうでもないです。) implode(string $separator, array $array): string
@maikeru (mikumo) これを踏まえると
@maikeru (mikumo) implode ラッパー関数 function php74_implode(mixed $separator, mixed $array): string
{ // implode($array, $separator) 対応 if (is_string($array) && is_array($separator)) { return implode($array, $separator); } return implode($separator, $array); }
@maikeru (mikumo) まだ、 コードにも改善点があります。
@maikeru (mikumo) 問題 3 : return する順番 まず正常系をさっさと return させます。
• implode(string $separator, array $array): string • implode(array $array): string 異常系でエミュレートすべきコードは下げます。 • implode(array $array, string $separator): string • 引数の型が絞られたことによる対応
@maikeru (mikumo) 問題 4 : グローバル関数を明示 グローバル関数であることをはっきり明示するよう、名前空間を利用する。 ✗ implode($separator, $array);
◦ \implode($separator, $array);
@maikeru (mikumo) implode ラッパー関数 function php74_implode(mixed $separator, mixed $array): string
{ // \implode(string $separator, array $array): string if (is_string($separator) && is_array($array)) { return \implode($separator, $array); } // \implode(array $array): string if (is_array($separator) && $array === null) { return \implode($separator); } (ここから下に PHP 7.4 をエミュレートするコードを書く)
@maikeru (mikumo) 引数はどんな型でも受け付ける …けど、本当に正しいの?
@maikeru (mikumo) 実際に PHP 7.4 の implode 関数の引数に いろんな型を入れてみました。
@maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string
$array = null; var_dump( implode($array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
@maikeru (mikumo) 問題 5 : エラーレベルの変更 PHP 8 系ではエラーレベルがより上位のエラーレベルに変更されている物が 多い。
✗ implode($separator, $array); ◦ \implode($separator, $array);
@maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string
$array = 'example'; var_dump( implode($array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
@maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string
$separator = null; $array = null; var_dump( implode($separator, $array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
@maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string
$separator = true; $array = [1, 2, 3]; var_dump( implode($separator, $array) ); • PHP 7.4: 123 • PHP 8.2: 123 ($separator は boolean なのにエラーじゃない)
@maikeru (mikumo) いわゆる ブラックボックステスト ですね。
@maikeru (mikumo) implode ラッパー関数 (ここより上が正常系) if ($separator === null &&
is_array($array)) { return \implode($array); } if (is_array($separator)) { return \implode((string)$array, $separator); }
@maikeru (mikumo) implode ラッパー関数 if ($separator === null && is_array($array))
{ return \implode($array); } if ($array === null) { return null; } return null; }
@maikeru (mikumo) ちなみに確認用で PHPUnit テストコード 1,000 ケース以上書きました。
@maikeru (mikumo) 今回のまとめ • PHP 8 系で始まった型の厳密化の影響は、こんなところにもでる • 公式ドキュメントだけで考えず、必ず実行して試してみる •
PHP は型を意識したプログラミングが重要になっていく
@maikeru (mikumo) ありがとうございました