Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

徹底攻略!PHP5.4

8,272 views

Published on

オープンソースカンファレンス2012 Hokkaido
LOCAL PHP部

Published in: Technology

徹底攻略!PHP5.4

  1. 1. 徹底攻略!PHP5.4 OSC 2012 Hokk aido LOCAL PHP部 佐藤琢哉(nazo)12年6月16日土曜日
  2. 2. 今あなたの目の前に 立っている人について • 佐藤琢哉 • @nazo • LOCAL PHP部 部長 • フリーランスやめました • 結婚しました • 自宅警備員12年6月16日土曜日
  3. 3. PHPカンファレンス 北海道12年6月16日土曜日
  4. 4. 超お願い12年6月16日土曜日
  5. 5. LOCAL PHP部 参加者募集中 • 特に喋ってくれる人募集中! • むしろ来年のOSCは代わりに喋る ぜ!ってくらいで! • 来年のPHPカンファレンス北海道でも 喋って!(あれば) • 詳細は「LOCAL PHP部」で検索!12年6月16日土曜日
  6. 6. LOCAL PHP部 • 隔月でPHPの勉強会を開催 • 次回は8月を予定 • 参加自体は誰でも可能 • 部員になる必要はない • 誰でもイベントを主催できます • このセッションもLOCAL PHP部 勉強会の一環12年6月16日土曜日
  7. 7. 過去のPHP部の活動 • PHPカンファレンス北海道 • 開発環境対決! • CakePHPハンズオン • 通常のセミナー形式12年6月16日土曜日
  8. 8. 勉強会に参加すると こんなにいいことが! • PHP仲間と知り合える • 実務ではなかなか導入できない技術情報を知 ることができる • 肉が食える(かもしれない) • PHP部で就職が決まりました!(結構ある) • PHP部で結婚できました!(関係ない)12年6月16日土曜日
  9. 9. さあ、君も LOCAL PHP部へ!12年6月16日土曜日
  10. 10. おわり12年6月16日土曜日
  11. 11. ?12年6月16日土曜日
  12. 12. 今日の内容 • PHPのここまで • PHP5.4とは • PHPのこれから12年6月16日土曜日
  13. 13. 大体どういう話なの? • 最近のPHPはこんな感じだよ! • PHP悪くないよ! • PHP使いやすくなってるよ!12年6月16日土曜日
  14. 14. これまでのあらすじ12年6月16日土曜日
  15. 15. 平成時代に入り、最近の若者が、極端に PHPを嫌いになっていると言われています。12年6月16日土曜日
  16. 16. あの国民的アイドルグループの派生グループの メンバーも、COBOL検定一級を持っていると 言いますが、PHPについては触れられていません。 (C)CCBYSA 2010 OpenStreetMap.org contributors12年6月16日土曜日
  17. 17. 統計調査でも、PHPの人気は 下落傾向にあると言われています。 http://news.mynavi.jp/news/2012/06/14/146/index.html12年6月16日土曜日
  18. 18. これは、平成時代に入り、過剰PHP 嫌い文明に突入したと言えます。12年6月16日土曜日
  19. 19. しかし、 本当に若者たちは、 PHPの今を 知っているのでしょうか?12年6月16日土曜日
  20. 20. PHP5.3のおさらい12年6月16日土曜日
  21. 21. PHP5.3とは 何だったのか • namespace • 無名関数 • Phar • goto12年6月16日土曜日
  22. 22. namespace • これまで名前空間がないために長いクラス名 になっていたPHP界に革命 • 先進的フレームワークもこぞって採用 (Symfony2、FuelPHPなど) • クラス名の管理が簡潔になった • 過去の資産を使う場合は有効活用できないと いう難点12年6月16日土曜日
  23. 23. 無名関数 • usortの引数をものすごく書きやすくなっ たという革命 • 元々$hoge();($hogeは文字列)で関数 を呼べるので、使い所が難しい • PHP5.4からtype hintingで指定できるよ うになったので、型の厳格化の一環として は便利になる12年6月16日土曜日
  24. 24. Phar • 5.2から一応使えたけど、5.3から組み込 みになった • ライブラリの配布が簡単 • Silexなどで採用12年6月16日土曜日
  25. 25. goto • 絶対に! • 使っては! • いけない!!!!!12年6月16日土曜日
  26. 26. こうして、現代的な実装を 手に入れたPHP12年6月16日土曜日
  27. 27. これは、PHPの夜明けとも 言える、革命的な進化でした12年6月16日土曜日
  28. 28. しかし、我々には PHP最大の不満が 残されていました12年6月16日土曜日
  29. 29. array()←めんどい12年6月16日土曜日
  30. 30. PHP5.3で、array()を撲滅しよ うと働きかけていたが、当初は却下12年6月16日土曜日
  31. 31. PHP5.3で不採用にされ、誰も が絶望の淵に立たされていました12年6月16日土曜日
  32. 32. が、PHP5.3リリースの 2年後、突如として再浮上12年6月16日土曜日
  33. 33. そして、ついに!12年6月16日土曜日
  34. 34. Interactive shell php > $a = [1, 2, 3]; php > var_dump($a); array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }12年6月16日土曜日
  35. 35. こうして我々は、ついに array()の呪縛から解放された12年6月16日土曜日
  36. 36. class User extends AppModel { こんなコードも… public $name = User; public $validate = array( login => array( alphaNumeric => array( rule => alphaNumeric, required => true, message => Alphabets and numbers only ), between => array( rule => array(between, 5, 15), message => Between 5 to 15 characters ) ), password => array( rule => array(minLength, 8), message => Minimum 8 characters long ),12年6月16日土曜日
  37. 37. class User extends AppModel { なんということでしょう public $name = User; public $validate = [ login => [ alphaNumeric => [ rule => alphaNumeric, required => true, message => Alphabets and numbers only ], between => [ rule => [between, 5, 15], message => Between 5 to 15 characters ] ], password => [ rule => [minLength, 8], message => Minimum 8 characters long ],12年6月16日土曜日
  38. 38. これにより、タイプ数は5回も減り、全国の 電力消費量が10%削減されたと言われます (ウソです)12年6月16日土曜日
  39. 39. PHP5.4の目玉機能と も言える、 short syntax array12年6月16日土曜日
  40. 40. これにより、平成時代にPHPが 嫌われていた原因の一つである、 「PHPは配列やハッシュを書く のにarray()とか毎回書くのだ りーんだよpgr」 という批判に対抗することができ るようになりました。12年6月16日土曜日
  41. 41. しかしこれは PHP5.4の進化の 一つに過ぎません12年6月16日土曜日
  42. 42. PHP5.4の 大きな追加・変更12年6月16日土曜日
  43. 43. トレイト • クラスの継承の制約を解消するための仕組 み • 特定のクラスに対し、継承関係を無視して メソッド、プロパティを追加できる • 様々なクラスで使うメソッドなどを、継承 関係を無視して追加することができるの で、継承関係が簡潔になる12年6月16日土曜日
  44. 44. <?php trait logger { function log($var) { return error_log($var); } } class MyClass { use logger; function myMethod() { $this->log("MyClass::myMethod"); } } $c = new MyClass(); $c->myMethod();12年6月16日土曜日
  45. 45. トレイトはこんなことも できる • プロパティの定義 • 可視性の変更 • 名前の変更(エイリアス) • トレイトの組み合わせ • 抽象メソッドを持つトレイト12年6月16日土曜日
  46. 46. プロパティの定義 trait logger { public $x = 5; } class MyClass { use logger; function myMethod() { var_dump($this->x); } } $c = new MyClass(); $c->myMethod();12年6月16日土曜日
  47. 47. 同名の優先順位 trait logger { public function write() { echo "logger"; } } trait writer { public function write() { echo "writer"; } } class MyClass { use logger, writer { writer::write insteadof logger; } } $c = new MyClass(); $c->write(); // writer12年6月16日土曜日
  48. 48. 可視性の変更/エイリアス trait logger { public function log($var) { return error_log($var); } } class MyClass { use logger { log as private _log; } function myMethod() { $this->log("myMethod"); $this->_log("myMethod"); } } $c = new MyClass(); $c->myMethod(); // $c->_log(); // error12年6月16日土曜日
  49. 49. トレイトの組み合わせ trait Hello { public function sayHello() { echo Hello ; } } trait World { public function sayWorld() { echo World!; } } trait HelloWorld { use Hello, World; } class MyHelloWorld { use HelloWorld; } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld();12年6月16日土曜日
  50. 50. 抽象メソッドを持つトレイト trait Hello { public function sayHelloWorld() { echo Hello .$this->getWorld(); } abstract public function getWorld(); } class MyHelloWorld { use Hello; public function getWorld() { return Hokkaido!; } } $o = new MyHelloWorld(); $o->sayHelloWorld();12年6月16日土曜日
  51. 51. register_xxx/safe_mode /magic_quotes_xxx の廃止 • register_globals など • magic_quotes_gpc など • safe_mode 及び、関係する設定 • 今時使ってないよね? • 古いコードを移植する時に手抜きできな いので注意12年6月16日土曜日
  52. 52. Array dereferencing • 関数の戻り値などでの配列をそのまま扱 える12年6月16日土曜日
  53. 53. <?php function hoge() { return [1, 2, 3]; } $a = hoge()[2]; var_dump($a);12年6月16日土曜日
  54. 54. newしたクラスに すぐアクセス • (new foo)->bar();12年6月16日土曜日
  55. 55. <?=の常時有効化 • short_open_tagの設定とは関係なく • <?=のみが常に有効なのであって、<?は 有効にはならない • XML宣言にも安心 • PHPをテンプレートエンジンにしている フレームワークなどで便利12年6月16日土曜日
  56. 56. 未設定時の文字コードが UTF-8に • 今まではISO-8859-1 • htmlspecialchars / htmlentities など • default_charset • 未設定のまま何となく動かしていた場合 に変な挙動になる場合があるので注意12年6月16日土曜日
  57. 57. built-in web server • PHP自体にWebサーバー機能が入った • 開発するだけならApacheをインストールしなくて もできる • ただし本番運用には向いていない • mod_rewriteに依存している場合は厳しい • ルーティング指定機能があるので、それに対応し ているフレームワークなら利用可能(Symfony2 など)12年6月16日土曜日
  58. 58. 使い方 • php -S localhost:8000 (-Sは大文字) • カレントディレクトリが DocumentRootになる • 任意のDocumentRootにする場合は-t で指定12年6月16日土曜日
  59. 59. ルータースクリプト • mod_rewriteの代わりになるもの • php -S localhost:8000 router.php • どこにアクセスしても必ずrouter.phpを 通るようになる • router.php内でREQUEST_URIを見て 分岐させる12年6月16日土曜日
  60. 60. 速度向上 • 5.3と比べて、大体10%∼20%向上 • WordPressでは25%近く高速になったと いう例も • メモリ使用量も削減 • PHP側がボトルネックになっている環境 であれば、とりあえず入れてみる価値あり12年6月16日土曜日
  61. 61. これだけ覚えておけば 普段使うには十分!12年6月16日土曜日
  62. 62. その他 細かい修正12年6月16日土曜日
  63. 63. breakの引数に変数の 禁止 • break $var; ←これが駄目 • break 1; ←これは可 • 数字を指定すると、数字分のネストを抜 けることができる機能(知ってた?) • continueも12年6月16日土曜日
  64. 64. 2進数表記の追加 • 0b01010101112年6月16日土曜日
  65. 65. htmlspecialcharsの 引数に指定できる定数追加 • ENT_SUBSTITUTE / ENT_DISALLOWED / ENT_HTML401 / ENT_XML1 / ENT_XHTML / ENT_HTML5 • ENT_HTML5を指定しておくといいかも12年6月16日土曜日
  66. 66. @の速度改善 • エラー制御の@ • あまり使わないほうがいいけど… • 1.5倍ほど速くなったとか12年6月16日土曜日
  67. 67. type hintingに callableを追加 • function hoge(callable $f) { • 無名関数を引数に指定できる12年6月16日土曜日
  68. 68. 対話入力モードの改善 • php -a • cli.pager • lessとか指定できる • cli.prompt • 「php > 」 の「php」の部分を変更できる • fatal errorになっても終了しない12年6月16日土曜日
  69. 69. json_encodeの 機能追加 • JSON_PRETTY_PRINT • 見やすくする • JSON_UNESCAPED_SLASHES • スラッシュをエスケープしなくする • JSON_UNESCAPED_UNICODE • ユニコード文字列をエスケープしなくする12年6月16日土曜日
  70. 70. http_response_code() • httpのレスポンスコードを簡単に設定/ 取得できる • 今まではheader();でちゃんと指定しな いといけなかったのが、数字の指定だけ で全部やってくれる12年6月16日土曜日
  71. 71. クラスの静的メソッドの 呼び方 <?php class Hoge { static function fuga() { echo a,PHP_EOL; } } Hoge::{fu.ga}();12年6月16日土曜日
  72. 72. E_ALL に E_STRICT が含まれるように • 今までは E_ALL ¦ E_STRICT • これからは E_ALL のみ • 逆に E_STRICT を切りたい場合は • E_ALL ^ E_STRICT12年6月16日土曜日
  73. 73. 文字列オフセットの 指定方法 • $string = hoge ; • $string[1][0]; がエラーにならなくなった • Array dereferencing の副次作用かどう かは謎 • 意識して使う機会はないと思うが、挙動 が変わるので注意12年6月16日土曜日
  74. 74. mbstringの修正 • 絵文字サポート • ガラケー絵文字の相互変換が可能に • SJIS-DOCOMOなど • UTF-8のチェック強化12年6月16日土曜日
  75. 75. CallbackFilterIterator • 任意のIteratorに対し、コールバック関数を指 定することにより、逐一処理ができる、新し いIterator • RecursiveCallbackFilterIterator というのも ある • pure PHPでも実装できる内容なので、5.4以 下用に同名のクラスを作って互換性を保つこと もできる12年6月16日土曜日
  76. 76. <?php $iterator = new CallbackFilterIterator( new FilesystemIterator(__DIR__), function ($current, $key, $iterator) { return $current->isDir() && ! $iterator->isDot(); } ); foreach($iterator as $v) { var_dump($v); }12年6月16日土曜日
  77. 77. mysqli_result • Traversable対応 • foreachで回せるようになった • Iteratorではない(残念)12年6月16日土曜日
  78. 78. $mysqli = new mysqli( localhost, root, , test ); foreach( $mysqli->query( SELECT * FROM hoge ) as $result) { var_dump($result); }12年6月16日土曜日
  79. 79. PHP5.4のまとめ12年6月16日土曜日
  80. 80. 劇的ではないが 確実な変更 • 5.3の時の無名関数やnamespaceほどの インパクトはない • かゆいところに手が届く変更が多い • 高速化も重要 • トレイトは使い所が難しい12年6月16日土曜日
  81. 81. 各ディストリビューションの 対応 • CentOSではremi-testリポジトリで入る • UbuntuではDotdeb等から入れる • Macでは「php5.4 osx」とかでぐぐる と方法が出てくる • つまり、まだ正式対応されているものは (おそらく)ない12年6月16日土曜日
  82. 82. PHPのライフサイクル • 5.2はもうサポートが終了している • 5.3は来年の春くらいか?ただし5.2が結 構長続きしたのでわからない • 原則として古いものを使い続けることは 推奨されない12年6月16日土曜日
  83. 83. 互換性 • レンタルサーバーとかは要注意(そう簡単に アップデートされないだろうけど) • むしろレンタルサーバーを運営している人 が注意 • モダンな書き方をしていれば、それほど問題 は発生しない • 古い書き方が癖になっている人は大変12年6月16日土曜日
  84. 84. PHPの今後12年6月16日土曜日
  85. 85. PHP5.4.1∼5.4.4の 変更点 • 基本的にバグ修正のみ • 安心して最新バージョンを使おう12年6月16日土曜日
  86. 86. PHP5.4.3 CGIモード関係の脆弱性 • URLの末尾に?-sとか入れるとソースが見れた り • URLの末尾に?-dでパラメータを指定すると… • コマンドラインオプションがURLで渡せてし まう • PHP5.4.3/PHP5.3.13で修正済み • レンタルサーバーの人は特に注意12年6月16日土曜日
  87. 87. PHP5.4.4 • crypt関数のセキュリティ問題の修正とか • 64bit環境で「"9223372036854775808" == "09223372036854775808"」が FALSEになった • 32bitの場合は「"9007199254740992" == " 9007199254740992"」 • そんなに目立つものはない12年6月16日土曜日
  88. 88. PHP5.5は こうなる!? • <?php タグを省略できるようにな る!? • エラーハンドリングの強化!? • 変数のtaint判定!? • Autoboxing!? • リフレクションの強化!? この内容は全て検討中のものです。 実装が決定されているものではないのでご注意下さい。12年6月16日土曜日
  89. 89. PHPタグを省略できる ようになる!? • 全部がプログラムとして使われるPHP ファイルの、先頭の<?phpを書かなくて も良くなる(?) • ファイルの拡張子を「.phpp」にすると そうなる(?) この内容は全て検討中のものです。 実装が決定されているものではないのでご注意下さい。12年6月16日土曜日
  90. 90. 変数のtaint判定!? • $_GETとかの変数をそのままechoする とwarningなどを出すようにする(?) • 安全なプログラムが書きやすくなる (?) この内容は全て検討中のものです。 実装が決定されているものではないのでご注意下さい。12年6月16日土曜日
  91. 91. Autoboxing!? • 例えば、$a = 1;に対し、$a->foo();のよ うに、クラスのように何かを呼び出すこ とができるようにする(?) • そのために、プリミティブ型をラップす るクラスを用意し、その変換方法を定義 する(?) この内容は全て検討中のものです。 実装が決定されているものではないのでご注意下さい。12年6月16日土曜日
  92. 92. 新情報の先取り • http://wiki.php.net/rfc12年6月16日土曜日
  93. 93. PHP悪くないよ!12年6月16日土曜日
  94. 94. 「速度の向上」 「他言語のいいところ採用」 「セキュリティ面の強化」12年6月16日土曜日
  95. 95. PHP先生の今後に ご期待下さい12年6月16日土曜日
  96. 96. おわり12年6月16日土曜日

×