Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP勉強会@東京 (第148回) - PHP 7 系と PHP 8 系の違いをラッパー関数を...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
380
Qiita Night PHP - エラーメッセージを読んでエラーを解決する
mainy
0
92
PyCon JP 2022 - Playwright で高機能ブラウザテスト
mainy
0
600
PHP Conference Japan 2022 - 背景色を基に見やすい文字色を自動で選択させるために WCAG ガイドラインを使う
mainy
0
640
PHPerKaigi 2022 - LT - 【視聴者参加型】 PHP この記号はなんでしょう?
mainy
0
590
Other Decks in Programming
See All in Programming
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
190
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
300
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
180
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
110
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
300
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
440
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.7k
どこまでゆるくて許されるのか
tk3fftk
0
470
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Become a Pro
speakerdeck
PRO
31
6k
Marketing to machines
jonoalderson
1
5.6k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
870
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
310
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Rails Girls Zürich Keynote
gr2m
96
14k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Into the Great Unknown - MozCon
thekraken
41
2.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
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) ありがとうございました