徹底攻略!PHP5.4
              OSC 2012 Hokk aido




                 LOCAL PHP部 佐藤琢哉(nazo)

12年6月16日土曜日
今あなたの目の前に
              立っている人について
         • 佐藤琢哉
         • @nazo
         • LOCAL PHP部 部長
         • フリーランスやめました
         • 結婚しました
         • 自宅警備員
12年6月16日土曜日
PHPカンファレンス
                  北海道




12年6月16日土曜日
超お願い



12年6月16日土曜日
LOCAL PHP部
                参加者募集中
         • 特に喋ってくれる人募集中!
         • むしろ来年のOSCは代わりに喋る
              ぜ!ってくらいで!

         • 来年のPHPカンファレンス北海道でも
              喋って!(あれば)

         • 詳細は「LOCAL PHP部」で検索!
12年6月16日土曜日
LOCAL PHP部
         • 隔月でPHPの勉強会を開催
          • 次回は8月を予定
         • 参加自体は誰でも可能
          • 部員になる必要はない
         • 誰でもイベントを主催できます
         • このセッションもLOCAL PHP部 勉強会の一環

12年6月16日土曜日
過去のPHP部の活動

         • PHPカンファレンス北海道
         • 開発環境対決!
         • CakePHPハンズオン
         • 通常のセミナー形式

12年6月16日土曜日
勉強会に参加すると
              こんなにいいことが!
         • PHP仲間と知り合える
         • 実務ではなかなか導入できない技術情報を知
              ることができる

         • 肉が食える(かもしれない)
         • PHP部で就職が決まりました!(結構ある)
         • PHP部で結婚できました!(関係ない)
12年6月16日土曜日
さあ、君も
        LOCAL PHP部へ!


12年6月16日土曜日
おわり



12年6月16日土曜日
?
12年6月16日土曜日
今日の内容

         • PHPのここまで
         • PHP5.4とは
         • PHPのこれから


12年6月16日土曜日
大体どういう話なの?

         • 最近のPHPはこんな感じだよ!
         • PHP悪くないよ!
         • PHP使いやすくなってるよ!


12年6月16日土曜日
これまでのあらすじ



12年6月16日土曜日
平成時代に入り、最近の若者が、極端に
     PHPを嫌いになっていると言われています。

12年6月16日土曜日
あの国民的アイドルグループの派生グループの
      メンバーも、COBOL検定一級を持っていると
     言いますが、PHPについては触れられていません。
              (C)CCBYSA 2010 OpenStreetMap.org contributors
12年6月16日土曜日
統計調査でも、PHPの人気は
     下落傾向にあると言われています。
          http://news.mynavi.jp/news/2012/06/14/146/index.html
12年6月16日土曜日
これは、平成時代に入り、過剰PHP
      嫌い文明に突入したと言えます。
12年6月16日土曜日
しかし、
               本当に若者たちは、
                 PHPの今を
              知っているのでしょうか?




12年6月16日土曜日
PHP5.3のおさらい



12年6月16日土曜日
PHP5.3とは
               何だったのか
         • namespace
         • 無名関数
         • Phar
         • goto

12年6月16日土曜日
namespace
         • これまで名前空間がないために長いクラス名
              になっていたPHP界に革命

         • 先進的フレームワークもこぞって採用
              (Symfony2、FuelPHPなど)

         • クラス名の管理が簡潔になった
         • 過去の資産を使う場合は有効活用できないと
              いう難点


12年6月16日土曜日
無名関数
         • usortの引数をものすごく書きやすくなっ
              たという革命

         • 元々$hoge();($hogeは文字列)で関数
              を呼べるので、使い所が難しい

         • PHP5.4からtype hintingで指定できるよ
              うになったので、型の厳格化の一環として
              は便利になる


12年6月16日土曜日
Phar

         • 5.2から一応使えたけど、5.3から組み込
              みになった

         • ライブラリの配布が簡単
          • Silexなどで採用

12年6月16日土曜日
goto

         • 絶対に!
         • 使っては!
         • いけない!!!!!


12年6月16日土曜日
こうして、現代的な実装を
              手に入れたPHP
12年6月16日土曜日
これは、PHPの夜明けとも
     言える、革命的な進化でした
12年6月16日土曜日
しかし、我々には
              PHP最大の不満が
              残されていました


12年6月16日土曜日
array()←めんどい



12年6月16日土曜日
PHP5.3で、array()を撲滅しよ
     うと働きかけていたが、当初は却下
12年6月16日土曜日
PHP5.3で不採用にされ、誰も
     が絶望の淵に立たされていました
12年6月16日土曜日
が、PHP5.3リリースの
        2年後、突如として再浮上
12年6月16日土曜日
そして、ついに!



12年6月16日土曜日
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日土曜日
こうして我々は、ついに
     array()の呪縛から解放された
12年6月16日土曜日
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日土曜日
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日土曜日
これにより、タイプ数は5回も減り、全国の
      電力消費量が10%削減されたと言われます
                    (ウソです)
12年6月16日土曜日
PHP5.4の目玉機能と
             も言える、
        short syntax array


12年6月16日土曜日
これにより、平成時代にPHPが
       嫌われていた原因の一つである、
       「PHPは配列やハッシュを書く
       のにarray()とか毎回書くのだ
          りーんだよpgr」
       という批判に対抗することができ
         るようになりました。

12年6月16日土曜日
しかしこれは
              PHP5.4の進化の
              一つに過ぎません


12年6月16日土曜日
PHP5.4の
              大きな追加・変更


12年6月16日土曜日
トレイト
         • クラスの継承の制約を解消するための仕組
              み

         • 特定のクラスに対し、継承関係を無視して
              メソッド、プロパティを追加できる

         • 様々なクラスで使うメソッドなどを、継承
              関係を無視して追加することができるの
              で、継承関係が簡潔になる


12年6月16日土曜日
<?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日土曜日
トレイトはこんなことも
                できる
        • プロパティの定義
        • 可視性の変更
        • 名前の変更(エイリアス)
        • トレイトの組み合わせ
        • 抽象メソッドを持つトレイト

12年6月16日土曜日
プロパティの定義
    trait logger {
          public $x = 5;
    }
    class MyClass {
          use logger;
          function myMethod() {
               var_dump($this->x);
          }
    }
    $c = new MyClass();
    $c->myMethod();



12年6月16日土曜日
同名の優先順位
    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();               // writer


12年6月16日土曜日
可視性の変更/エイリアス
    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(); // error

12年6月16日土曜日
トレイトの組み合わせ
    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日土曜日
抽象メソッドを持つトレイト
    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日土曜日
register_xxx/safe_mode
                /magic_quotes_xxx
                        の廃止
         • register_globals など
         • magic_quotes_gpc など
         • safe_mode 及び、関係する設定
         • 今時使ってないよね?
         • 古いコードを移植する時に手抜きできな
              いので注意


12年6月16日土曜日
Array
              dereferencing


         • 関数の戻り値などでの配列をそのまま扱
              える




12年6月16日土曜日
<?php
    function hoge() {
         return [1, 2, 3];
    }
    $a = hoge()[2];
    var_dump($a);


12年6月16日土曜日
newしたクラスに
                すぐアクセス


         • (new foo)->bar();



12年6月16日土曜日
<?=の常時有効化
         • short_open_tagの設定とは関係なく
         • <?=のみが常に有効なのであって、<?は
              有効にはならない

              • XML宣言にも安心
         • PHPをテンプレートエンジンにしている
              フレームワークなどで便利


12年6月16日土曜日
未設定時の文字コードが
           UTF-8に
         • 今まではISO-8859-1
         • htmlspecialchars / htmlentities など
         • default_charset
         • 未設定のまま何となく動かしていた場合
              に変な挙動になる場合があるので注意



12年6月16日土曜日
built-in web server
         •    PHP自体にWebサーバー機能が入った

         •    開発するだけならApacheをインストールしなくて
              もできる

              •   ただし本番運用には向いていない

         •    mod_rewriteに依存している場合は厳しい

              •   ルーティング指定機能があるので、それに対応し
                  ているフレームワークなら利用可能(Symfony2
                  など)



12年6月16日土曜日
使い方

         • php -S localhost:8000 (-Sは大文字)
         • カレントディレクトリが
              DocumentRootになる

              • 任意のDocumentRootにする場合は-t
               で指定



12年6月16日土曜日
ルータースクリプト
         • mod_rewriteの代わりになるもの
         • php -S localhost:8000 router.php
         • どこにアクセスしても必ずrouter.phpを
              通るようになる

         • router.php内でREQUEST_URIを見て
              分岐させる


12年6月16日土曜日
速度向上
         • 5.3と比べて、大体10%∼20%向上
         • WordPressでは25%近く高速になったと
              いう例も

         • メモリ使用量も削減
         • PHP側がボトルネックになっている環境
              であれば、とりあえず入れてみる価値あり


12年6月16日土曜日
これだけ覚えておけば
       普段使うには十分!


12年6月16日土曜日
その他
              細かい修正


12年6月16日土曜日
breakの引数に変数の
               禁止
         • break $var; ←これが駄目
         • break 1; ←これは可
         • 数字を指定すると、数字分のネストを抜
              けることができる機能(知ってた?)

         • continueも

12年6月16日土曜日
2進数表記の追加


         • 0b010101011



12年6月16日土曜日
htmlspecialcharsの
       引数に指定できる定数追加

         • ENT_SUBSTITUTE /
              ENT_DISALLOWED /
              ENT_HTML401 / ENT_XML1 /
              ENT_XHTML / ENT_HTML5

         • ENT_HTML5を指定しておくといいかも

12年6月16日土曜日
@の速度改善

         • エラー制御の@
         • あまり使わないほうがいいけど…
         • 1.5倍ほど速くなったとか


12年6月16日土曜日
type hintingに
               callableを追加


         • function hoge(callable $f) {
         • 無名関数を引数に指定できる


12年6月16日土曜日
対話入力モードの改善
         • php -a
         • cli.pager
          • lessとか指定できる
         • cli.prompt
          • 「php > 」 の「php」の部分を変更できる
         • fatal errorになっても終了しない

12年6月16日土曜日
json_encodeの
                  機能追加
         • JSON_PRETTY_PRINT
          • 見やすくする
         • JSON_UNESCAPED_SLASHES
          • スラッシュをエスケープしなくする
         • JSON_UNESCAPED_UNICODE
          • ユニコード文字列をエスケープしなくする
12年6月16日土曜日
http_response_code()


         • httpのレスポンスコードを簡単に設定/
              取得できる

         • 今まではheader();でちゃんと指定しな
              いといけなかったのが、数字の指定だけ
              で全部やってくれる



12年6月16日土曜日
クラスの静的メソッドの
            呼び方
    <?php

    class Hoge {
         static function fuga() {
              echo 'a',PHP_EOL;
         }
    }

    Hoge::{'fu'.'ga'}();
12年6月16日土曜日
E_ALL に E_STRICT
           が含まれるように
         • 今までは E_ALL ¦ E_STRICT
         • これからは E_ALL のみ
         • 逆に E_STRICT を切りたい場合は
          • E_ALL ^ E_STRICT

12年6月16日土曜日
文字列オフセットの
                指定方法
         • $string = hoge ;
         • $string[1][0]; がエラーにならなくなった
         • Array dereferencing の副次作用かどう
              かは謎

         • 意識して使う機会はないと思うが、挙動
              が変わるので注意


12年6月16日土曜日
mbstringの修正

         • 絵文字サポート
          • ガラケー絵文字の相互変換が可能に
          • SJIS-DOCOMOなど
         • UTF-8のチェック強化

12年6月16日土曜日
CallbackFilterIterator

         • 任意のIteratorに対し、コールバック関数を指
              定することにより、逐一処理ができる、新し
              いIterator

         • RecursiveCallbackFilterIterator というのも
              ある

         • pure PHPでも実装できる内容なので、5.4以
              下用に同名のクラスを作って互換性を保つこと
              もできる


12年6月16日土曜日
<?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日土曜日
mysqli_result

         • Traversable対応
         • foreachで回せるようになった
         • Iteratorではない(残念)


12年6月16日土曜日
$mysqli = new mysqli(
      'localhost', 'root', '', 'test'
    );

    foreach(
      $mysqli->query(
        'SELECT * FROM hoge'
      ) as $result) {
           var_dump($result);
    }
12年6月16日土曜日
PHP5.4のまとめ



12年6月16日土曜日
劇的ではないが
                 確実な変更
         • 5.3の時の無名関数やnamespaceほどの
              インパクトはない

         • かゆいところに手が届く変更が多い
         • 高速化も重要
         • トレイトは使い所が難しい

12年6月16日土曜日
各ディストリビューションの
             対応
         • CentOSではremi-testリポジトリで入る
         • UbuntuではDotdeb等から入れる
         • Macでは「php5.4 osx」とかでぐぐる
              と方法が出てくる

         • つまり、まだ正式対応されているものは
              (おそらく)ない


12年6月16日土曜日
PHPのライフサイクル

         • 5.2はもうサポートが終了している
         • 5.3は来年の春くらいか?ただし5.2が結
              構長続きしたのでわからない

         • 原則として古いものを使い続けることは
              推奨されない



12年6月16日土曜日
互換性
         • レンタルサーバーとかは要注意(そう簡単に
              アップデートされないだろうけど)

              • むしろレンタルサーバーを運営している人
               が注意

         • モダンな書き方をしていれば、それほど問題
              は発生しない

         • 古い書き方が癖になっている人は大変
12年6月16日土曜日
PHPの今後



12年6月16日土曜日
PHP5.4.1∼5.4.4の
               変更点


         • 基本的にバグ修正のみ
         • 安心して最新バージョンを使おう


12年6月16日土曜日
PHP5.4.3
        CGIモード関係の脆弱性
         • URLの末尾に?-sとか入れるとソースが見れた
              り

         • URLの末尾に?-dでパラメータを指定すると…
         • コマンドラインオプションがURLで渡せてし
              まう

         • PHP5.4.3/PHP5.3.13で修正済み
         • レンタルサーバーの人は特に注意
12年6月16日土曜日
PHP5.4.4
         • crypt関数のセキュリティ問題の修正とか
         • 64bit環境で「"9223372036854775808"
              == "09223372036854775808"」が
              FALSEになった

              • 32bitの場合は「"9007199254740992"
               == " 9007199254740992"」

         • そんなに目立つものはない
12年6月16日土曜日
PHP5.5は
                こうなる!?
         • <?php タグを省略できるようにな
              る!?

         • エラーハンドリングの強化!?
         • 変数のtaint判定!?
         • Autoboxing!?
         • リフレクションの強化!?
                     この内容は全て検討中のものです。
                実装が決定されているものではないのでご注意下さい。
12年6月16日土曜日
PHPタグを省略できる
           ようになる!?
         • 全部がプログラムとして使われるPHP
              ファイルの、先頭の<?phpを書かなくて
              も良くなる(?)

         • ファイルの拡張子を「.phpp」にすると
              そうなる(?)


                     この内容は全て検討中のものです。
                実装が決定されているものではないのでご注意下さい。
12年6月16日土曜日
変数のtaint判定!?

         • $_GETとかの変数をそのままechoする
              とwarningなどを出すようにする(?)

         • 安全なプログラムが書きやすくなる
              (?)


                     この内容は全て検討中のものです。
                実装が決定されているものではないのでご注意下さい。
12年6月16日土曜日
Autoboxing!?
         • 例えば、$a = 1;に対し、$a->foo();のよ
              うに、クラスのように何かを呼び出すこ
              とができるようにする(?)

         • そのために、プリミティブ型をラップす
              るクラスを用意し、その変換方法を定義
              する(?)

                     この内容は全て検討中のものです。
                実装が決定されているものではないのでご注意下さい。
12年6月16日土曜日
新情報の先取り


         • http://wiki.php.net/rfc



12年6月16日土曜日
PHP悪くないよ!



12年6月16日土曜日
「速度の向上」
       「他言語のいいところ採用」
          「セキュリティ面の強化」



12年6月16日土曜日
PHP先生の今後に
                ご期待下さい


12年6月16日土曜日
おわり



12年6月16日土曜日

徹底攻略!PHP5.4

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