徹底攻略!PHP5.4

8,019 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日土曜日

×