Submit Search
Upload
PHP foreachでの参照渡しに潜む罠
•
Download as ODP, PDF
•
2 likes
•
3,875 views
Takaaki Hirano
Follow
Be careful to passing value by reference in foreach.
Read less
Read more
Technology
Report
Share
Report
Share
1 of 40
Download now
Recommended
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
基礎からわかる、機械学習のソフトウェアテストのへの適用例 - 「Bag Of Words」を使った「類似チケットの検索」
基礎からわかる、機械学習のソフトウェアテストのへの適用例 - 「Bag Of Words」を使った「類似チケットの検索」
Nozomi Ito
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
Hideki Takase
テストエンジニア版RPG風スキルマップ JaSST'17東北
テストエンジニア版RPG風スキルマップ JaSST'17東北
Noriyuki Nemoto
PHP超入門@LL温泉
PHP超入門@LL温泉
Sotaro Karasawa
Activity-Net Challenge 2021の紹介
Activity-Net Challenge 2021の紹介
Toru Tamaki
Sprytniejsze testowanie kodu java ze spock framework (zaawansowane techniki) ...
Sprytniejsze testowanie kodu java ze spock framework (zaawansowane techniki) ...
PROIDEA
World Locking Tools V1.0.0について~ 機能と導入 ~
World Locking Tools V1.0.0について~ 機能と導入 ~
Takahiro Miyaura
Recommended
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
基礎からわかる、機械学習のソフトウェアテストのへの適用例 - 「Bag Of Words」を使った「類似チケットの検索」
基礎からわかる、機械学習のソフトウェアテストのへの適用例 - 「Bag Of Words」を使った「類似チケットの検索」
Nozomi Ito
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
Hideki Takase
テストエンジニア版RPG風スキルマップ JaSST'17東北
テストエンジニア版RPG風スキルマップ JaSST'17東北
Noriyuki Nemoto
PHP超入門@LL温泉
PHP超入門@LL温泉
Sotaro Karasawa
Activity-Net Challenge 2021の紹介
Activity-Net Challenge 2021の紹介
Toru Tamaki
Sprytniejsze testowanie kodu java ze spock framework (zaawansowane techniki) ...
Sprytniejsze testowanie kodu java ze spock framework (zaawansowane techniki) ...
PROIDEA
World Locking Tools V1.0.0について~ 機能と導入 ~
World Locking Tools V1.0.0について~ 機能と導入 ~
Takahiro Miyaura
object detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: survey
Takuya Minagawa
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験
樽八 仲川
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
Nmapの真実(続)
Nmapの真実(続)
abend_cve_9999_0001
「トピックモデル」を使った「バグチケットの自動タグ付け」
「トピックモデル」を使った「バグチケットの自動タグ付け」
Koichi Tanizaki
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
tmtm otm
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
Fujio Kojima
3DESの件 〜俺、112bitになります〜
3DESの件 〜俺、112bitになります〜
enigma63
New Relicで始める、.NET Applications on AWSのObservability
New Relicで始める、.NET Applications on AWSのObservability
Takayoshi Tanaka
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
Masahiro Nishimi
Transforming Accessibility one lunch at a tiime - CSUN 2023
Transforming Accessibility one lunch at a tiime - CSUN 2023
Ted Drake
【CVPR 2020 メタサーベイ】Image Retrieval
【CVPR 2020 メタサーベイ】Image Retrieval
cvpaper. challenge
効率的学習 / Efficient Training(メタサーベイ)
効率的学習 / Efficient Training(メタサーベイ)
cvpaper. challenge
深層学習の非常に簡単な説明
深層学習の非常に簡単な説明
Seiichi Uchida
Grad-CAMの始まりのお話
Grad-CAMの始まりのお話
Shintaro Yoshida
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
SSII
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
Yasutomo Uemori
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
Junko Nakayama
GitHub入門 手順編
GitHub入門 手順編
hideaki honda
180215 Ponanzaにおける強化学習、ディープラーニングとその先
180215 Ponanzaにおける強化学習、ディープラーニングとその先
HEROZ-JAPAN
PHP array_uintersectに潜む罠
PHP array_uintersectに潜む罠
Takaaki Hirano
20170401 alias
20170401 alias
sela-parlack
More Related Content
What's hot
object detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: survey
Takuya Minagawa
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験
樽八 仲川
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
Nmapの真実(続)
Nmapの真実(続)
abend_cve_9999_0001
「トピックモデル」を使った「バグチケットの自動タグ付け」
「トピックモデル」を使った「バグチケットの自動タグ付け」
Koichi Tanizaki
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
tmtm otm
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
Fujio Kojima
3DESの件 〜俺、112bitになります〜
3DESの件 〜俺、112bitになります〜
enigma63
New Relicで始める、.NET Applications on AWSのObservability
New Relicで始める、.NET Applications on AWSのObservability
Takayoshi Tanaka
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
Masahiro Nishimi
Transforming Accessibility one lunch at a tiime - CSUN 2023
Transforming Accessibility one lunch at a tiime - CSUN 2023
Ted Drake
【CVPR 2020 メタサーベイ】Image Retrieval
【CVPR 2020 メタサーベイ】Image Retrieval
cvpaper. challenge
効率的学習 / Efficient Training(メタサーベイ)
効率的学習 / Efficient Training(メタサーベイ)
cvpaper. challenge
深層学習の非常に簡単な説明
深層学習の非常に簡単な説明
Seiichi Uchida
Grad-CAMの始まりのお話
Grad-CAMの始まりのお話
Shintaro Yoshida
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
SSII
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
Yasutomo Uemori
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
Junko Nakayama
GitHub入門 手順編
GitHub入門 手順編
hideaki honda
180215 Ponanzaにおける強化学習、ディープラーニングとその先
180215 Ponanzaにおける強化学習、ディープラーニングとその先
HEROZ-JAPAN
What's hot
(20)
object detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: survey
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Nmapの真実(続)
Nmapの真実(続)
「トピックモデル」を使った「バグチケットの自動タグ付け」
「トピックモデル」を使った「バグチケットの自動タグ付け」
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
自然言語処理における深層学習を用いた予測の不確実性 - Predictive Uncertainty in NLP -
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
3DESの件 〜俺、112bitになります〜
3DESの件 〜俺、112bitになります〜
New Relicで始める、.NET Applications on AWSのObservability
New Relicで始める、.NET Applications on AWSのObservability
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
Transforming Accessibility one lunch at a tiime - CSUN 2023
Transforming Accessibility one lunch at a tiime - CSUN 2023
【CVPR 2020 メタサーベイ】Image Retrieval
【CVPR 2020 メタサーベイ】Image Retrieval
効率的学習 / Efficient Training(メタサーベイ)
効率的学習 / Efficient Training(メタサーベイ)
深層学習の非常に簡単な説明
深層学習の非常に簡単な説明
Grad-CAMの始まりのお話
Grad-CAMの始まりのお話
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
SSII2020TS: Event-Based Camera の基礎と ニューラルネットワークによる信号処理 〜 生き物のように「変化」を捉えるビジョンセ...
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
Lightningアプリケーションビルダー(基本操作と標準コンポーネント)
GitHub入門 手順編
GitHub入門 手順編
180215 Ponanzaにおける強化学習、ディープラーニングとその先
180215 Ponanzaにおける強化学習、ディープラーニングとその先
Similar to PHP foreachでの参照渡しに潜む罠
PHP array_uintersectに潜む罠
PHP array_uintersectに潜む罠
Takaaki Hirano
20170401 alias
20170401 alias
sela-parlack
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Ruby 同好会宣言
Ruby 同好会宣言
Yuya Takeyama
Livesense tech night immutable-js at a glance
Livesense tech night immutable-js at a glance
Yuta Shimakawa
Similar to PHP foreachでの参照渡しに潜む罠
(6)
PHP array_uintersectに潜む罠
PHP array_uintersectに潜む罠
20170401 alias
20170401 alias
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Ruby 同好会宣言
Ruby 同好会宣言
Livesense tech night immutable-js at a glance
Livesense tech night immutable-js at a glance
More from Takaaki Hirano
プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
Takaaki Hirano
金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう
Takaaki Hirano
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
Takaaki Hirano
Mysql(クライアント)の出力が変わるオプション達
Mysql(クライアント)の出力が変わるオプション達
Takaaki Hirano
curl_multi_exec()でFire-and-forgetに失敗した話
curl_multi_exec()でFire-and-forgetに失敗した話
Takaaki Hirano
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
Takaaki Hirano
PHPUnit 4.0で追加されたwillReturn*()の紹介
PHPUnit 4.0で追加されたwillReturn*()の紹介
Takaaki Hirano
書こう!正規表現 vol.3 ()
書こう!正規表現 vol.3 ()
Takaaki Hirano
sedで複数行処理 使ってみようNを
sedで複数行処理 使ってみようNを
Takaaki Hirano
ctagsでvimにひきこもる
ctagsでvimにひきこもる
Takaaki Hirano
書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)
Takaaki Hirano
書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)
Takaaki Hirano
書こう!ユニットテスト vol.2 どうやって?
書こう!ユニットテスト vol.2 どうやって?
Takaaki Hirano
書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何
Takaaki Hirano
書こう!ユニットテスト vol.1 ナンデ?
書こう!ユニットテスト vol.1 ナンデ?
Takaaki Hirano
Cocproxy
Cocproxy
Takaaki Hirano
More from Takaaki Hirano
(20)
プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話
月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
Mysql(クライアント)の出力が変わるオプション達
Mysql(クライアント)の出力が変わるオプション達
curl_multi_exec()でFire-and-forgetに失敗した話
curl_multi_exec()でFire-and-forgetに失敗した話
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
PHPUnit 4.0で追加されたwillReturn*()の紹介
PHPUnit 4.0で追加されたwillReturn*()の紹介
書こう!正規表現 vol.3 ()
書こう!正規表現 vol.3 ()
sedで複数行処理 使ってみようNを
sedで複数行処理 使ってみようNを
ctagsでvimにひきこもる
ctagsでvimにひきこもる
書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)
書こう!ユニットテスト vol.2 どうやって?
書こう!ユニットテスト vol.2 どうやって?
書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何
書こう!ユニットテスト vol.1 ナンデ?
書こう!ユニットテスト vol.1 ナンデ?
Cocproxy
Cocproxy
Recently uploaded
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
Recently uploaded
(10)
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
PHP foreachでの参照渡しに潜む罠
1.
PHP foreachでの参照渡しに潜む罠
2.
foreachでループ中に配列の値を変更したいとき 参照渡しにしたりしますよね
3.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } var_dump($array);
4.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } var_dump($array); array(3) { [0]=> string(3) "FOO" [1]=> string(3) "BAR" [2]=> &string(3) "BAZ" }
5.
ここまで想定通り
6.
ではこの配列にもう一度foreachを、 今度は非参照渡しで使うと?
7.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } foreach ($array as $key => $value) { $array[$key] = strtolower($value); } var_dump($array);
8.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } foreach ($array as $key => $value) { $array[$key] = strtolower($value); } var_dump($array); array(3) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> &string(3) "bar" }
9.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } foreach ($array as $key => $value) { $array[$key] = strtolower($value); } var_dump($array); array(3) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> &string(3) "bar" } !?
10.
配列が破壊されてしまう
11.
どうしてこうなった
12.
$valueがforeachを抜けた後も参照を保持していることが原因 どうしてこうなった
13.
$valueがforeachを抜けた後も参照を保持していることが原因 どうしてこうなった 「いまいちよくわからない」 (東京都 会社員
T・H)
14.
$valueがforeachを抜けた後も参照を保持していることが原因 どうしてこうなった 「いまいちよくわからない」 (東京都 会社員
T・H) 「こころにひびかない」 (東京都 会社員 T・H)
15.
$valueがforeachを抜けた後も参照を保持していることが原因 どうしてこうなった 「いまいちよくわからない」 (東京都 会社員
T・H) 「こころにひびかない」 (東京都 会社員 T・H) 「おすしがたべたい」 (東京都 会社員 T・H)
16.
実際何が起こっているのか
17.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // 各ループの処理開始前に何が代入されているのか?
18.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // 各ループの処理開始前に何が代入されているのか? // $value = &$array[0] = ‘foo’ // $value = &$array[1] = ‘bar’ // $value = &$array[2] = ‘baz’
19.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // 各ループの処理開始前に何が代入されているのか? // $value = &$array[0] = ‘foo’ // $value = &$array[1] = ‘bar’ // $value = &$array[2] = ‘baz’ // $valueを変更して参照先の$array[n]を変更している
20.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // ループ終了後に$valueはどうなっているのか?
21.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // ループ終了後に$valueはどうなっているのか? // $value = &$array[2] = ‘BAZ’
22.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // ループ終了後に$valueはどうなっているのか? // $value = &$array[2] = ‘BAZ’ // これは$array[2]への参照なので、 // $valueを変更すると$array[2]が変更される
23.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); }
24.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); } // 各ループの処理開始前に何が代入されているのか?
25.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); } // 各ループの処理開始前に何が代入されているのか? // ($value = &$array[2]) = ($array[0] = ‘FOO’)
26.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); } // 各ループの処理開始前に何が代入されているのか? // ($value = &$array[2]) = ($array[0] = ‘FOO’) // ($value = &$array[2]) = ($array[1] = ‘BAR’)
27.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); } // 各ループの処理開始前に何が代入されているのか? // ($value = &$array[2]) = ($array[0] = ‘FOO’) // ($value = &$array[2]) = ($array[1] = ‘BAR’) // ($value = &$array[2]) = ($array[2] = ‘BAR’)
28.
$array = [‘foo’,
‘bar’, ‘baz’] foreach ($array as &$value) { $value = strtoupper($value); } // $value = &$array[2] = ‘BAZ’ foreach ($array as $key => $value) { $array[$key] = strtolower($value); } var_dump($array); array(3) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> &string(3) "bar" }
29.
回避するために
30.
二回目も参照渡しにする
31.
書くタイミングがずれていると忘れる危険性が高い 間に大量のコードがあると忘れる危険性が高い 別の人間が書くならば尚更 二回目も参照渡しにする
32.
書くタイミングがずれていると忘れる危険性が高い 間に大量のコードがあると忘れる危険性が高い 別の人間が書くならば尚更 そもそも、「この後はこういうふうに書かないと壊れます」 などという書き方自体すべきではない 二回目も参照渡しにする
33.
ループを抜けたらunset($value)する
34.
実はマニュアルでも推奨されている http://php.net/manual/ja/control-structures.foreach.php ループを抜けたらunset($value)する
35.
実はマニュアルでも推奨されている http://php.net/manual/ja/control-structures.foreach.php 書き忘れる危険性はある ループを抜けたらunset($value)する
36.
参照渡ししない
37.
そもそも参照渡ししなければ当然起こらない 参照渡ししない
38.
そもそも参照渡ししなければ当然起こらない 参照渡ししない foreach ($array as
$key => $value) { $array[$key] = strtolower($value); } $array_lower = []; foreach ($array as $value) { $array_lower[] = strtolower($value); }
39.
そもそも参照渡ししなければ当然起こらない 参照渡ししない foreach ($array as
$key => $value) { $array[$key] = strtolower($value); } $array_lower = []; foreach ($array as $value) { $array_lower[] = strtolower($value); } 確実だがちょっと書くのが面倒な場合もある
40.
わかりにくいバグの温床になるので 気をつけましょう
Download now