SlideShare ist ein Scribd-Unternehmen logo
1 von 96
Downloaden Sie, um offline zu lesen
徹底攻略!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日土曜日

Weitere ähnliche Inhalte

Ähnlich wie 徹底攻略!PHP5.4

Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会Yuji Otani
 
CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話memememomo
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜Hideo Kashioka
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)純生 野田
 
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkYuji Takayama
 
魔法少女 Laravel
魔法少女 Laravel魔法少女 Laravel
魔法少女 LaravelKenichi Mukai
 
Laravel4 Happy Hacking
Laravel4 Happy HackingLaravel4 Happy Hacking
Laravel4 Happy HackingTakashi Ohida
 
PHPの今とこれから2017
PHPの今とこれから2017PHPの今とこれから2017
PHPの今とこれから2017Rui Hirokawa
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerHideo Kashioka
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023Rui Hirokawa
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Hidetoshi Mori
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3ichikaway
 
意図を表現するプログラミング
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミングAtsuhiro Kubo
 
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Akio Ishida
 

Ähnlich wie 徹底攻略!PHP5.4 (20)

Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会
 
CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話CPANモジュールをPHPに移植してみた話
CPANモジュールをPHPに移植してみた話
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
いまどきのPHP
いまどきのPHPいまどきのPHP
いまどきのPHP
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
 
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech Talk
 
WCO2012「PHP教室」
WCO2012「PHP教室」WCO2012「PHP教室」
WCO2012「PHP教室」
 
魔法少女 Laravel
魔法少女 Laravel魔法少女 Laravel
魔法少女 Laravel
 
Laravel4 Happy Hacking
Laravel4 Happy HackingLaravel4 Happy Hacking
Laravel4 Happy Hacking
 
Slimの紹介
Slimの紹介Slimの紹介
Slimの紹介
 
PHPの今とこれから2017
PHPの今とこれから2017PHPの今とこれから2017
PHPの今とこれから2017
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginer
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
 
意図を表現するプログラミング
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミング
 
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト
 

Mehr von Takuya Sato

レガシープロダクトを改善していくための戦い方
レガシープロダクトを改善していくための戦い方レガシープロダクトを改善していくための戦い方
レガシープロダクトを改善していくための戦い方Takuya Sato
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外Takuya Sato
 
Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Takuya Sato
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHPTakuya Sato
 
PHPとMongoDBで学ぶ次世代データストア
PHPとMongoDBで学ぶ次世代データストアPHPとMongoDBで学ぶ次世代データストア
PHPとMongoDBで学ぶ次世代データストアTakuya Sato
 
PHPでセキュリティを真面目に考える
PHPでセキュリティを真面目に考えるPHPでセキュリティを真面目に考える
PHPでセキュリティを真面目に考えるTakuya Sato
 

Mehr von Takuya Sato (6)

レガシープロダクトを改善していくための戦い方
レガシープロダクトを改善していくための戦い方レガシープロダクトを改善していくための戦い方
レガシープロダクトを改善していくための戦い方
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
 
Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHP
 
PHPとMongoDBで学ぶ次世代データストア
PHPとMongoDBで学ぶ次世代データストアPHPとMongoDBで学ぶ次世代データストア
PHPとMongoDBで学ぶ次世代データストア
 
PHPでセキュリティを真面目に考える
PHPでセキュリティを真面目に考えるPHPでセキュリティを真面目に考える
PHPでセキュリティを真面目に考える
 

徹底攻略!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日土曜日
  • 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日土曜日
  • 12. 今日の内容 • PHPのここまで • PHP5.4とは • PHPのこれから 12年6月16日土曜日
  • 13. 大体どういう話なの? • 最近のPHPはこんな感じだよ! • PHP悪くないよ! • PHP使いやすくなってるよ! 12年6月16日土曜日
  • 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日土曜日
  • 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日土曜日
  • 30. PHP5.3で、array()を撲滅しよ うと働きかけていたが、当初は却下 12年6月16日土曜日
  • 31. PHP5.3で不採用にされ、誰も が絶望の淵に立たされていました 12年6月16日土曜日
  • 32. が、PHP5.3リリースの 2年後、突如として再浮上 12年6月16日土曜日
  • 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 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. 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. これにより、タイプ数は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 = new mysqli( 'localhost', 'root', '', 'test' ); foreach( $mysqli->query( 'SELECT * FROM hoge' ) as $result) { var_dump($result); } 12年6月16日土曜日
  • 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日土曜日
  • 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日土曜日
  • 94. 「速度の向上」 「他言語のいいところ採用」 「セキュリティ面の強化」 12年6月16日土曜日
  • 95. PHP先生の今後に ご期待下さい 12年6月16日土曜日