SlideShare a Scribd company logo
‹#› 
PHP de 
フィールドインジェクション 
第84回 PHP勉強会 
! 
竹澤 有貴 
The title of the presentation can go here, and it can span nearly the width of the page Company Proprietary and Confidential
profile 
ytake 
• php, node.js, RDBMS, NoSQL 
• Laravel ユーザーグループ 
• NewSQL 
• React.js がんばり中 
https://www.facebook.com/ 
yuuki.takezawa 
https://twitter.com/ex_takezawa 
竹澤 有貴 
yuuki takezawa “
PHPでフィールドインジェクションって 
要るの? 
ytake
たぶん 要らない 
ytake
まずは前提知識から 
ytake
DI / Service Locater 
ytake 
• 明確な違い、わかりますか? 
• 似ているけど少し違う 
• PHP-DI 
• Aura.DI 
• Ray.DI 
• OrnoDi 
• ZendDi 
• Symfony/DependencyInjection 
• Pimple 
• illuminate/container 
“違いは?
コンテナから、 
ある名前をキーに登録されたオブジェクト 
を取り出す 
ytake
$container['db'] = function() { 
ytake 
return new PDO( 
'mysql:dbname=tests;host=localhost', 
'root', 
‘root' 
); 
}; 
var_dump($container[‘db’]());
インスタンス生成時に 
必要なものをコンテナが渡してくれる 
ytake
interface SomethingInterface 
{ 
ytake 
public function perform(); 
} 
class Something implements SomethingInterface 
{ 
public function perform() 
{ 
return 'hello'; 
} 
}
class Perform 
{ 
ytake 
public function __construct( 
SomethingInterface $something 
) { 
$this->something = $something; 
} 
public function something() 
{ 
return $this->something->perform(); 
} 
} 
new Perform(new Something);
ytake 
$container->make("Perform"); 
全部コンテナがやってくれる
interfaceじゃなきゃだめなのか? 
ytake 
• コンテナが解決してくれるもの 
なら何でも 
• コンストラクタに文字列だった 
り配列だったり、なんでも良い 
• それぞれのライブラリはそこら 
辺を上手くカバーしてくれます 
• 所謂コンストラクタインジェク 
ション 
N“o!
フィールドインジェクションって 
なんだ? 
ytake
public class FrogMan 
{ 
ytake 
@Inject private Vehicle vehicle; 
} 
!
フィールドインジェクション 
ytake 
• プロパティに注入 
• アノテーション(JSR-330 etc) 
• 単純で分かり易いが、 
状況によってはテストし辛くな 
るのであまりお勧めされない 
• PHPでもDIライブラリで実装して 
るものも結構ある 
• javaは標準で使える (Guiceとか 
SpringFrameworkのとかあるけど) 
j“ava etc..
Compiler! 
ytake
PHPにはそんなものは無い 
(インタープリタ型) 
ytake
そこまでして使いたいのか? 
ytake
javaに寄せたライブラリは多い 
だがSpringに寄せたものはあまりない 
とりあえずやってみよう! 
PHPのコンテナ、アノテーションライブ 
ラリを使おう! 
ytake
フィールドインジェクションをどう再現するか 
ytake 
• doctrine/annotation 
• リフレクション 
• コンパイラがないので作る 
(nick/PHP-Parser) 
• Laravelユーザーなので 
illuminate/container 
(利用者が少ないものを選んだ) 
• Spring Framework! 
• オートスキャン @Componentだ 
考“えた
illuminate/Container 
ytake 
• DIとしての機能はある 
• もちろんサービスロケーターも 
• バインディングのbindに慣れている 
• 5のコンテナで@Qualifierに近い事が 
• @Scopeの実装が楽 
簡“単
Laravelコンテナはこういう感じ 
ytake
binding1 
$this->bind("hoge", "HogeContainerRepository"); 
hogeって名前を呼んだら 
HogeContainerRepository くれ 
ytake
binding2 
ytake 
$this->bind("AcmeInterface", "Acme"); 
このインターフェースが 
コンストラクタにあったら 
このクラスを注入せよ
binding3 
AppClassにはこれを注入せよ 
*次期バージョンから(develop only) 
ytake 
$container->when(‘AppClass) 
->needs(‘HogeInterface) 
->give(‘Hoge);
newInstance 
ytake 
$container->make(‘AppClass); 
依存を解決して 
インスタンスを生成せよ! 
シングルトンもあり
@Component 
ytake 
• SpringのBeanと同じ様に 
• Symfony/Finder 優秀 
• andrewsville/php-token-reflection 
tokenizerとリフレクションを使った 
ライブラリ 
• ClassのみでComponent(“name”) 
• インターフェイス, クラスの関連 
コンテナに 
登録“
@Autowired 
class Perform 
{ 
ytake 
/** 
* @Autowired("Interface") 
*/ 
protected $repository; 
}
だがしかし、 
そもそも 
フィールドインジェクションの 
仕組みは無い 
ytake
コンストラクタに突っ込めば 
やりたい事が解決できる 
コンパイラとして継承したクラスを 
吐き出して実行すれば良い 
ytake
final class CompiledPerform extends Perform 
{ 
ytake 
public function __construct( 
Interface $repository 
){ 
$this->repository = $repository; 
} 
}
こんな感じで継承クラスを 
実行させる様にした 
ytake
速度が遅い! 
ytake 
• 元のライブラリの10倍くらい遅い 
• コンパイルしたクラスを吐き出して 
移行はそれを使う様にする 
(3倍遅いくらい) 
• xhprofで見たらdoctrine/annotationが 
一番ボトルネックだった 
(キャッシュ忘れてた) 
• フィールドインジェクションを 
毎回読むのも遅いので、 
全部吐き出す様にした 
キ“ャッシュ
結果 
object(CompiledPerform)#20 (1) { 
["repository":protected]=> 
object(Repository)#21 (0) { 
} 
} 
できた 
ytake
ボトルネックがautoloaderになった 
ytake
待てよ 
コンストラクタに突っ込むなら 
要らないんじゃ・・・?? 
ytake
無駄な産物が出来てしまった・・ 
https://github.com/ytake/Iono.Container 
ytake
ytake
ご清聴ありがとうございました 
ytake

More Related Content

PDF
Laravel_オープンソースカンファレンスhokkaido_JP_2014
PDF
Laravel / Lumen 次の一歩
PDF
LaravelとMVCの先へ
PDF
php開発で使うタスクランナー gulp
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PPTX
Laravelを使ってみた
PPTX
〜laravel で学ぶ MVC
PPTX
Phpフレームワーク 「laravel」でブログを作ろう
Laravel_オープンソースカンファレンスhokkaido_JP_2014
Laravel / Lumen 次の一歩
LaravelとMVCの先へ
php開発で使うタスクランナー gulp
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Laravelを使ってみた
〜laravel で学ぶ MVC
Phpフレームワーク 「laravel」でブログを作ろう

What's hot (20)

PDF
Laravel5.1 Release
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
PDF
Laravel5.1をつかったWebアプリケーション開発
PDF
H2O and php
PDF
Laravelのパッケージのテストに便利なパッケージ
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PPTX
おっさんES6/ES2015,React.jsを学ぶ
PDF
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
PDF
AspectMock 最強のモッキングフレームワーク
PDF
PHPカンファレンス2014の懇親会飛び込みLT資料
PPTX
今日から始めるLaravel
PDF
わかると楽しいInfrastructure as code
PDF
【Camphor ×サイボウズ】selenium勉強会
KEY
capybara で快適なテスト生活を
PPTX
Why Kotlin?
PDF
Hello Java
PDF
Infrastructure as codeのススメ
PPTX
PHPで並列処理する ライブラリを作った
PDF
PHP Application E2E with Capybara
PPTX
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
Laravel5.1 Release
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
Laravel5.1をつかったWebアプリケーション開発
H2O and php
Laravelのパッケージのテストに便利なパッケージ
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
おっさんES6/ES2015,React.jsを学ぶ
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
AspectMock 最強のモッキングフレームワーク
PHPカンファレンス2014の懇親会飛び込みLT資料
今日から始めるLaravel
わかると楽しいInfrastructure as code
【Camphor ×サイボウズ】selenium勉強会
capybara で快適なテスト生活を
Why Kotlin?
Hello Java
Infrastructure as codeのススメ
PHPで並列処理する ライブラリを作った
PHP Application E2E with Capybara
エンドツーエンドテストを自動化したらチームがすごく良くなった@XPまつり2015LT
Ad

Viewers also liked (20)

PDF
Laravel meetup5(Laravel meet NewSQL/VoltDB )
PDF
zend-expressiveを触ってみよう
PDF
PHP&NewSQLで考える次世代アプリケーション
PDF
phpspecで始めるBDD
PDF
PHPデプロイツールの世界
PDF
WordCamp Tokyo2016itkaasan
PDF
Node.jsでデータ収集して デスクトップアプリを作ろう!
PDF
Windows Azure kaasanイメージについて
PDF
Svgアニメーションを実装してみよう 20150207
PDF
PDF
魔法少女 Laravel 2014
PDF
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
PPT
BuddyPressで街のポータルサイトを作ろう
PDF
laravel x モバイルアプリ
PDF
Laravel heroku-push
PDF
Bootstrapにちょい足しアニメーション@春のJavascript祭り
PDF
アニメーション(のためのパフォーマンス)の基礎知識
PDF
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
PDF
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
PDF
大規模スクラムの失敗から学んだこと #AgileJapan2015
Laravel meetup5(Laravel meet NewSQL/VoltDB )
zend-expressiveを触ってみよう
PHP&NewSQLで考える次世代アプリケーション
phpspecで始めるBDD
PHPデプロイツールの世界
WordCamp Tokyo2016itkaasan
Node.jsでデータ収集して デスクトップアプリを作ろう!
Windows Azure kaasanイメージについて
Svgアニメーションを実装してみよう 20150207
魔法少女 Laravel 2014
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
BuddyPressで街のポータルサイトを作ろう
laravel x モバイルアプリ
Laravel heroku-push
Bootstrapにちょい足しアニメーション@春のJavascript祭り
アニメーション(のためのパフォーマンス)の基礎知識
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
大規模スクラムの失敗から学んだこと #AgileJapan2015
Ad

Similar to PHP フィールドインジェクションに挑戦する PHP勉強会2014 (20)

PDF
Software Development with Symfony
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024
PDF
Symfony2でより良いソフトウェアを作るために
PPTX
PHP基礎勉強会
PDF
PHPカンファレンス関西2014 「全てを結ぶ力」
KEY
BEAR.Sunday@phpcon2012
ODP
Doctrineではじめるsymfony1.2開発
PDF
Symfony2 Behat/BDD (#Symfony2study 4)
PDF
PHPにおけるRIA事情と開発
PDF
スクリプト言語PHP攻略法
PDF
Best practice laravel
PDF
いまどきのPHP開発現場 -2015年秋-
PPTX
Php5 4勉強会
PDF
第21回Creators MeetUp
PDF
意図を表現するプログラミング
PDF
Eclipse PDT + MakeGood による PHP コードのテスト
KEY
Composer
PPTX
App Engine と いまどきのPHP
PDF
Web技術勉強会 20100925
PDF
Spring3.1概要x di
Software Development with Symfony
PHPの今とこれから2024 at PHP Conference Japan 2024
Symfony2でより良いソフトウェアを作るために
PHP基礎勉強会
PHPカンファレンス関西2014 「全てを結ぶ力」
BEAR.Sunday@phpcon2012
Doctrineではじめるsymfony1.2開発
Symfony2 Behat/BDD (#Symfony2study 4)
PHPにおけるRIA事情と開発
スクリプト言語PHP攻略法
Best practice laravel
いまどきのPHP開発現場 -2015年秋-
Php5 4勉強会
第21回Creators MeetUp
意図を表現するプログラミング
Eclipse PDT + MakeGood による PHP コードのテスト
Composer
App Engine と いまどきのPHP
Web技術勉強会 20100925
Spring3.1概要x di

PHP フィールドインジェクションに挑戦する PHP勉強会2014