Your SlideShare is downloading. ×
PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

PHPカンファレンス2013 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~

5,852
views

Published on

PHPカンファレンス2013で発表したスライドです。 …

PHPカンファレンス2013で発表したスライドです。
PHP逆引きレシピ改訂版の改訂ポイントなどを紹介しています。


2 Comments
15 Likes
Statistics
Notes
  • とんでもありません。そういった意見があってこその本書です。

    実のところ、このご意見をいただく前から改訂内容の大筋は決まっていたのですが、ご指摘いただいた部分は執筆側からしても必要性を感じていた部分で、これは的を射たものだと思います。

    この改訂版がAndo様のご期待に答えられるものであることを願っています。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 失礼を承知で手厳しい意見を書いたのは私です。改定頂き誠にありがとうございます。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
5,852
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
19
Comments
2
Likes
15
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 今ドキのPHPの書き方 ~PHP逆引きレシピ改訂版~ PHP逆引きレシピ 改訂版 執筆チーム 浅野 仁(@ts_asano) 櫻井 雄大(@Y_Sakurai)
  • 2. 1 PHP逆引きレシピとは?
  • 3. 2
  • 4. 3
  • 5. 4 PHP逆引きレシピとは? ● ”いまさら聞けない・誰も教えてくれない” 本当に必要な知識と技が一冊に凝縮! ● 主要レンタルサーバーの設定方法と差異、 セキュリティ対策の詳細も解説! ● 初級レベルから中級レベルまで 幅広くカバーし、レベルアップに最適! ● 初版発売日:2009年6月29日
  • 6. 5 発売日:2009年6月29日 ※初版です
  • 7. 6 あれから4年の月日が流れ… PHPと、それを取り巻く環境の変化 ● メジャーバージョン 5.3→5.4→5.5 ● オブジェクト指向が当たり前の時代 ● PEARからComposerへ ...などなど
  • 8. 7 こんな手厳しい意見も 2009年頃はこの本がPHPの本の中で一番優れて いたと思うが、今やこの本を買ってPHPに取りかか ろうものなら、PHPのバージョンアップの激しさにプ ログラムが動かなくなるのは時間の問題。 ... (後略)
  • 9. 8 新時代を生き抜くための 逆引き本を! ● レガシーなコードを一新 ● 新レシピの追加 ● HTML5対応 ...などなど、かなりの部分を書き直し/追加
  • 10. 9 ぶっちゃけた話 半分以上 書き直しました
  • 11. 10 さらにいうなら 150ページぐらい 増えてます (40レシピ以上の追加)
  • 12. 11 _人人人人人人人_ > もはや鈍器 <  ̄Y^Y^Y^Y^Y^Y ̄ 2割増って、普通考えたら、ありえない
  • 13. 12 こんな人にオススメ こんな用途に... ● 開発者向け学習・研修 ● 開発時のリファレンス ● 専門学校・大学のテキスト こんな人に... ● PHPを学習中の初級者 ● 開発経験が少ない PHPプログラマー ● セキュリティ対策について 学習し直したい中級者 New! ● 最近のPHP開発手法に ついて学習したい人
  • 14. 13 こんな人は対象外 ● 全くのWebプログラミング初心者 ● PHP上級者 New! ● PHP4~5.2と心中したい方 ※といっても、大体のサンプルは古いPHPのバージョンでも動作します
  • 15. 14 ※注意※ 「今ドキの」とはいっても、 non-flatなPHPは対象外 ● 1レシピ完結型の「逆引き」本 ● 特定のフレームワークなどに依存しない記述 ● ページ数の制約 という色々な事情から… (代わりに、初学者向けにフレームワークの説明を追加)
  • 16. 15 改訂の概要 削除 New! New! 変更 初版 第二版 第1章 準備 第2章 PHPの基本構文 第3章 PHPの基本テクニック 第4章 ファイルとディレクトリ 第5章 PEARとSmarty 第6章 Webプログラミング 第7章 クラスとオブジェクト 第8章 セキュリティ 第9章 トラブルシューティング 第10章 アプリケーション編 第1章 準備 第2章 PHPの基本構文 第3章 PHPの基本テクニック 第4章 ファイルとディレクトリ 第5章 クラスとオブジェクト 第6章 ライブラリ 第7章 Webプログラミング 第8章 データベース 第9章 自動テスト 第10章 セキュリティ 第11章 トラブルシューティング
  • 17. 16 改訂ポイントひとめぐり(1) ● 準備:開発/本番環境 (XAMPPの新バージョンや統合開発環境など) ● 基本構文 (流行りの無名関数や新Verでの仕様変更など) ● クラス (名前空間、例外処理、SPLなど) ● ライブラリ (Composer,フレームワーク概要,Smarty3対応)
  • 18. 17 開発/本番環境 ● XAMPP 1.8.3/MAMP 2.1.4に対応 OpenSSLモジュールがデフォルト有効化など、細かい違い も... ● コマンドライン用パス設定など、初級者向けのつまづきや すいポイントなども追記 ● 推奨開発環境をNetBeansで統一 ○ git/hg/svnなど各種VCSにデフォルト対応 ○ 変数の初期化漏れなど、警告機能が充実 ○ PHPUnit,コードカバレッジも標準対応 ○ ソフトウェア、ドキュメントが日本語...などなど ● 本番環境を節分けし、より逆引きしやすく読みやすく 各レンサバの内容も、現時点での最新状況を
  • 19. 18 基本構文 ● Nowdoc構文、無名関数などの新要素 ● break,continue,isset()などの仕様変更にも言及 ○ 文字列を配列として添え字付きアクセスしたときの挙 動とか ○ break, continueの戻る階層数に変数が使えなくなっ たとか ○ その他キャストの仕様変更など、PHP5.3から5.5まで で変わったポイントを言及
  • 20. 19 たとえば... $str = 'string'; var_dump(isset($str['a'])); PHP5.3までと5.4以降ではどうなるでしょうか?
  • 21. 19 たとえば... $str = 'string'; var_dump(isset($str['a'])); PHP5.3までと5.4以降ではどうなるでしょうか? ↓ せいかい PHP5.3: true PHP5.4以降: false
  • 22. 20 クラス(1) ● クラスを活用するための様々な機能解説 ○ マジックメソッド、シリアライズ、タイプヒンティング、 インターフェースなどなど ○ 最近流行りのオートローダも詳細解説 ● 今ドキのモジュール管理で必須な名前空間について ● オブジェクト指向初心者の壁:例外処理 ● SPLについても、ポイントを押さえて解説
  • 23. 21 クラス(2) 初版 5レシピ ⇒  第2版 22レシピ 個人的に初めて使ったフレームワークがFuelPHP ⇒名前空間の存在に感動 オートローダーの存在もあり、FuelPHPのコードの 美しさを感じたのがこの章を充実させるきっかけに
  • 24. 22 ライブラリ ● Composer ○ パッケージ管理ツールの新定番 (実際は、"依存管理ツール") ○ 初学者にはつらいcomposer.jsonの記述や内容 の意味などを解説 ● フレームワーク ○ 初学者向けにフレームワークの概要を解説 ○ 何となく使われがちなコトバ「MVC」の話も
  • 25. 23 composer.lock 意外と見落としがち? installコマンドで作成されるcomposer.lockの意味 ● 実際にインストールしたパッケージのバージョン情報な どを格納 ● installコマンド時、このファイルがもともと存在すると... ○ composer.lockに記載されている厳密なバージョン をインストールしようとする VCSで共有すれば、開発者間のパッケージを しっかり統一できる!
  • 26. 24 改訂ポイントひとめぐり(2) ● データベース (PDO利用、SQLite対応など) ● ユニットテスト (PHPUnit、Seleniumによるブラウザテストなど) ● セキュリティ (XSS対策の強化、クリックジャッキングなど) ● トラブルシューティング (Xdebugの利用、デバッグ方法など)
  • 27. 25 データベース(1) MySQLとSQLiteでの微妙な記述の違いに言及 PostgreSQLは、あきらめました… なぜSQLite? ⇒SQLiteのファイルをPHP上で作って、スマートフォンのアプ リにダウンロードして使用する、ということが  実務であったため
  • 28. 26 データベース(2) 今回、PDO+プリペアドステートメント (エミュレーションOFF) で全面書き直し http://d.hatena.ne.jp/ockeghem/20090711/p1 ● 当時は、PHP4も生き残っていたため、 書籍側でPHP4対応する必要があった ● また、レンサバ含む様々な環境も考慮する必要があった ● そのため、昔のMySQL-API(プリペア利用不可)で 記述せざるをえなかった
  • 29. 27 データベース(3) PDOの謎に迫る! ● bindValue()と bindParam()の違い ● 第3引数の型指定(PDO::PARAM_*)の意味
  • 30. 28 bindParam()の挙動(1) エミュレーションOnだと「アレ?」な挙動になることも $intValue = 256; $prepare->bindParam(':id', $intValue, PDO:: PARAM_INT) var_dump($intValue); $prepare->execute(); var_dump($intValue); => int(3) 256 string(3) "256"
  • 31. 29 bindParam()の挙動(2) bindParam()の第2引数は実は参照渡し 値が書き換えられても泣かない! ※PARAM_INTで型指定しててもキャストされる 参照渡しなので、キャストされた結果が$intValueに入る →もう全部bindValue()でいいんじゃないかな
  • 32. 30 PDO::PARAM_*の挙動(1) $prepare = $db->prepare('SELECT * FROM t WHERE id = :id); $strValue = '123'; $prepare->bindValue(':id', $strValue, PDO::PARAM_INT); $prepare->execute(); => 'SELECT * FROM t WHERE id = '123'; (pdo_mysqlの場合)
  • 33. 31 PDO::PARAM_*の挙動(2) PHPのソースを追いかけると... (php/php-src master ext/pdo/pdo_stmt.c:320) ● PARAM_STRは文字列に変換 ● PARAM_INTはbooleanをintに変換 (他はなにもしない) ● PARAM_BOOLはintをboolに変換 「PDO::PARAM_INTとはいったいなんだったのか」 (レビュアー様コメントより抜粋) ※指定しないと全部文字列にキャストされるので、 意味が全くないわけではないです
  • 34. 32 PHPUnit 言わずと知れた、自動テストのフレームワーク さきほどの PHP5.3: true PHP5.4以降: false …のような、理不尽な言語仕様の変更も トラブルになる前に発見できる(かも)
  • 35. 33 コードカバレッジのススメ(1) 皆さん使ってますか? コードカバレッジ
  • 36. 34 コードカバレッジのススメ(2) ● テストがきちんと行なわれているか? (テストカバー率) ● コードは保守しやすい形か? (CRAP) PHPUnitとXdebugでカバレッジと仲良くなろう! $ phpunit --coverage-html output_dir UnitTest.php
  • 37. 35 コードカバレッジのススメ(3) CRAPとは? ● 「Change Risk Anti-Patterns」の略 ● プログラム保守のしやすさを指標化したもの ● 条件分岐やテストカバー率によって変化 (大きいほどNG) ● 数値が30を越えると危険シグナル
  • 38. 36 PHPUnit_Selenium2(1) 今ドキのテストは、ブラウザテストも自動化! Seleniumなら、PHPで書けて学習コストも安上がり ● インストール、各ブラウザ別ドライバ導入方法 ● HTMLの各種要素取得方法 ● フォームの操作 など、基本的な作業に必要な要素をレシピに追加
  • 39. 37 PHPUnit_Selenium2(2) こんな風に書けます: public function testForm() { $this->url('example.php'); $textbox = $this->byCssSelector('input[type="text"]'); $textbox->value('PHP逆引きレシピ'); $submit = $this->byCssSelector('input[type="submit"]'); $submit->click(); $element = $this->byCssSelector('body > div > p'); $this->assertEquals('送信結果は「PHP逆引きレシピ」', $element- >text()); } テスト以外にも、ややこしいサイトのクローリング、 データ収集などにも応用できるかも?
  • 40. 38 PHPUnit_Selenium2(3) 実はこの本自体も、Seleniumのおかげで完成しました  XAMPP、MAMP  Linux  さくらのレンタルサーバ  ロリポップ  CORESERVER での検証ができたのは、Seleniumのおかげです
  • 41. 39 セキュリティ(1) いわゆる「徳丸本」を下敷きとして、 セキュリティ対策情報は初版から 更に磨きをかけています
  • 42. 40 セキュリティ(2) まだまだ話題が絶えないXSS 対応できていたと思っていても... ... <body onload="foo('<?php echo h(...);?>')"> ... (h()はhtmlspecialchars()と思ってください) おっと、そこはJavaScriptの文字列リテラルですよ?
  • 43. 41 セキュリティ(3) $u16 = mb_convert_encoding($matches[0], 'UTF-16'); $safe_str = preg_replace('/[0-9a-f]{4}/', 'u$0', bin2hex($u16)); こんな感じで Unicodeエスケープしてあげましょう ("uXXXX"の形) ※動的に出さなくて済むなら、それが一番いいです
  • 44. 42 他にも小ネタ(1) var_dump( '11111111111111111111' == '11111111111111111112' ); PHP5.4.3以前: true ※あいまいな比較時の文字列→数値のキャスト時 オーバーフローする場合の挙動が修正されている PHP5.4.4以降: false
  • 45. 43 他にも小ネタ(2) PHP5.5で導入された、 password_hash() 関数 実は有志作成のライブラリ導入で 以前のPHPでも使用可能になります! ※PHP5.3.7以降
  • 46. 44 まだまだたくさん 改訂ポイントはありますが... さすがに全部は無理です、ごめんなさい! ● HTML5まわりとか ● 暗号学的に安全なランダム文字列生成とか ● 業務系でよくある「組織図の作成」とか 気になる人は、ぜひ書店でお求めください!
  • 47. 45 初版のポリシー 「初級者から中級者へ」 「セキュリティをきちんと考慮した」 「実用的な『逆引き本』を」 はそのままに...
  • 48. 46 しっかり「今」に対応 追加レシピ満載の PHP逆引きレシピ 改訂版 10月下旬発売!(予定) ご清聴、ありがとうございました