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で無理矢理setAccessibleする方法(PHPer Kaigi 2022...
Search
maxima
March 11, 2024
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
レガシーなPHPで無理矢理setAccessibleする方法(PHPer Kaigi 2022 LT)
maxima
March 11, 2024
Other Decks in Technology
See All in Technology
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
1k
SharedWorkerを使ったキャッシュでネイティブアプリに負けないユーザー体験を目指す
kakehashi
PRO
1
100
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
140
Optunaの最新リリースv5.0について
pfn
PRO
0
120
CloudWatch Logsのコスト最適化:どこまでAIに任せてどこから人間が承認すべきか
yama3133
0
110
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
210
会社紹介資料 / Sansan Company Profile
sansan33
PRO
31
430k
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
290
大型犬好きによるPugの紹介
yamanoku
1
160
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
300
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
210
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
450
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
Mind Mapping
helmedeiros
1
400
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Optimizing for Happiness
mojombo
378
71k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Technical Leadership for Architectural Decision Making
baasie
3
600
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Transcript
【非推奨】レガシーなPHPで、 無理やりsetAccessibleする方法【使わないで!】 巻嶋 雄大
自己紹介 Hamee(ハミィ)株式会社 巻嶋 雄大(まきしま ゆうだい)
現行環境では非推奨になってる話をたくさんします!
現行環境では非推奨になってる話をたくさんします! 今更聞けない、PHP5.1(16年前にサポート切れ)のユニットテストについて (ひっそりと需要あるはず)
ユニットテストを作るぞ!
ユニットテストを作るぞ! レガシーシステムをPHP5.1からバージョンアップ
ユニットテストを作るぞ! レガシーシステムをPHP5.1からバージョンアップ バージョン間の互換性をどうやって担保するか?
ユニットテストを作るぞ! レガシーシステムをPHP5.1からバージョンアップ バージョン間の互換性をどうやって担保するか? カバレッジ100%で、PHP5.1と、最新PHPのユニットテストの結果 に差異がないなら、「互換性がある」とみなす。
privateのテストは必要なの? privateメソッドをテストすべきかどうかの議論は今回は置いておきます! 「必要だ」と思ったので、とりあえず今回は「privateメソッドのテストもするべき」と いう方向で話していきます!
第一選択はこれですよね
第一選択はこれですよね 残念ながら5.3.2という超モダンな(※ 13年前はモダン)バージョンから (今回は5.1)
どうしよう・・・
どうしよう・・・ PHP5.3.2に上げるためにはユニットテストを書かないといけない
どうしよう・・・ PHP5.3.2に上げるためにはユニットテストを書かないといけない ユニットテストを書くためにはPHP5.3.2にしなくてはいけない
代替案・・・
runkitを使います。
runkit_method_add クラスに対し、動的に、新しいメソッドを追加します。 知る人ぞ知る拡張モジュール
新しいバージョンのものが出たからか、いつの間にか公式ドキュメントから削除されてしま っていましたので、Web Archiveから。 http://web.archive.org/web/20200518121116/https://www.php.net/manual/ja/function.ru nkit-method-add.php 配布 https://pecl.php.net/package/runkit
通常、絶対に実行できないメソッド。どうやってテストす る? <?php class Sample { private function add($a, $b){
return $a + $b; } }
getterのように、privateメソッドを呼び出すwrapperを作ってあげれば良い。 <?php class SampleTest extends PHPUnit_Extensions_Database_TestCase { public function test_add
メソッドが$a と$b の和を返すこと(){ runkit_method_add( 'Sample', 'wrapper_add', '$a, $b', 'return $this->add($a,$b);', RUNKIT_ACC_PUBLIC ); $sample = new Sample(); $result = $sample->wrapper_add(100, 200); $this->assertSame(300, $result); runkit_method_remove( 'Sample', 'wrapper_add' ); } } class Sample { private function add($a, $b){ return $a + $b; } }
上から順に解説しますね!
<?php class SampleTest extends PHPUnit_Extensions_Database_TestCase { public function test_add メソッドが$a
と$b の和を返すこと(){ runkit_method_add( 'Sample', 'wrapper_add', '$a, $b', 'return $this->add($a,$b);', RUNKIT_ACC_PUBLIC ); $sample = new Sample(); $result = $sample->wrapper_add(100, 200); $this->assertSame(300, $result); runkit_method_remove( 'Sample', 'wrapper_add' ); } } class Sample { private function add($a, $b){ return $a + $b; } }
これを実行すると・・・ runkit_method_add( 'Sample', 'wrapper_add', '$a, $b', 'return $this->add($a,$b);', RUNKIT_ACC_PUBLIC );
before <?php class Sample { private function add($a, $b){ return
$a + $b; } } after <?php class Sample { private function add($a, $b){ return $a + $b; } public function wrapper_add($a, $b){ return $this->add($a, $b); } }
メモリ内で書き換わっているので、ソースコード自体は変わりません
<?php class SampleTest extends PHPUnit_Extensions_Database_TestCase { public function test_add メソッドが$a
と$b の和を返すこと(){ runkit_method_add( 'Sample', 'wrapper_add', '$a, $b', 'return $this->add($a,$b);', RUNKIT_ACC_PUBLIC ); $sample = new Sample(); $result = $sample->wrapper_add(100, 200); $this->assertSame(300, $result); runkit_method_remove( 'Sample', 'wrapper_add' ); } } class Sample { private function add($a, $b){ return $a + $b; } }
runkit_method_addでwrapper_addを追加したので、wrapper_addが 使える。 $sample = new Sample(); $result = $sample->wrapper_add(100, 200);
$this->assertSame(300, $result);
ずっと残しておくと悪影響があるかもしれないので、ユニットテスト単 位でちゃんと消しましょう。 runkit_method_remove( 'Sample', 'wrapper_add' );
<?php class SampleTest extends PHPUnit_Extensions_Database_TestCase { public function test_add メソッドが$a
と$b の和を返すこと(){ runkit_method_add( 'Sample', 'wrapper_add', '$a, $b', 'return $this->add($a,$b);', RUNKIT_ACC_PUBLIC ); $sample = new Sample(); $result = $sample->wrapper_add(100, 200); $this->assertSame(300, $result); runkit_method_remove( 'Sample', 'wrapper_add' ); } } class Sample { private function add($a, $b){ return $a + $b; } }
カバレッジも通ります。
何年もメンテナンスされていないプラグインなので、正しく動作しない部分もあると思いま す。 実際、ときどきSegmentation Faultなど、予期しないエラーが発生します。 それでも、 テストコードを何も書かないよりは100倍マシ。
最後に宣伝! ECやるならネクストエンジン! 初月無料! まずは検索してみてください!