PHPの今とこれから 2012
PHPカンファレンス2012
2012年9月15日(土)

                日本PHPユーザ会 廣川 類
ポスト5.3時代のコード
 マイクロフレームワークSlimの例
 モジュラーデザイン:名前空間、オートローダー

       http://www.example.com/hello/taro
        http://www.example.com/hello/taro          Hello, taro
                                                   Hello, taro
<?php
                                                          Composed
                                                          Composed
require 'vendor/autoload.php';

$app = new SlimSlim();                                  名前空間
                                                          名前空間
$app->get('/hello/:name', function ($name) use ($app) {
   $app->render('tpl1.php', array('name'=> $name));       無名関数
                                                          無名関数
});
$app->run();

 [tpl1.php]
  [tpl1.php]
 Hello, <?= $name; ?>
  Hello, <?= $name; ?>
PHP アンケート 2012

 主に使っているPHPのバージョン
  1) PHP 4.x
  2) PHP 5.0-5.1
  3) PHP 5.2
  4) PHP 5.3
  5) PHP 5.4
  6) 使ってない
PHPユーザ分布
usage of server-side programming language (2012/9/8)
        0.2% 0.6% 0.9% 1.2% 4.0%


                                21.2%
                                        PHP
                                        ASP.NET
                                        Java
                                        ColdFusion
                                        Perl
                                        Ruby             Market Share of CMS
    77.9%
                                                                22.8%     WordPress
                                                                          Joomla
                                                                  3.3%    Drupal
                                                 54.3%            3.7%    vBulletin
                                                                  7.0%    Blogger
                                                               8.9%       other

引用: W3Techs.com, 2012/9/8版
PHPユーザ分布
Version of PHP (2012/9/8, W3Techs.com)
               4.3%



                                    PHP 5
                                    PHP 4
                                         version of PHP 5 (2012/9/8, W3Techs.com)

                                                    4.1% 0.7%
            95.7%                                                             5.1

                                                                     36.5%    5.2

                                                                              5.3

                                                                              5.4
                                            58.6%
引用: W3Techs.com, 2012/9/8版
バージョンを更新する/しない理由

 「開発リソースの有効活用」とサポートの両立が課題


更新する理由            更新しない理由
・新機能/性能が魅力的
 ・新機能/性能が魅力的      ・更新/確認の手間
                   ・更新/確認の手間
・セキュリティ/バグ修正
 ・セキュリティ/バグ修正     ・新機能/性能の魅力小
                   ・新機能/性能の魅力小
・サポート切れ
 ・サポート切れ          ・周辺環境の更新が追いつかない
                   ・周辺環境の更新が追いつかない
PHPの歩み
                                                   `10/3 キャンセル
                                                   6.0               5.5
                                                  ・Unicode   `12/3

・エンジン/OOP大幅強化:ZE2                            `09/6           5.4
・XML対応強化(SimpleXML)                         5.3              ・Traits
・Webサービス(SOAP)                                               - 速度改善
・DB強化 (SQLite, MySQLi)            `06/11    ・名前空間            - MB対応標準化
                                            ・クロージャ
                         `05/11
                                   5.2      ・遅延静的束縛
                                                             - 組込みWebサーバ
                                                             - レガシー機能削除
                          5.1  ・メモリ/速度改善    ・GC改善
               `04/7                        ・MySQLnd
                         ・速度改善 ・入力フィルタ
                 5.0     ・PDO
     `02/12            `05/6
        4.3              4.4                       `10/12 (EOL)
                             `08/8 (EOL)
        ・CLI           ・バグ修正
        ・stream
       ・自動グローバル変数のデフォルト無効化
       ・mbregex
       ・zend-multibyte

        2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
   Web/DB      XML          PHP  フレームワーク   スマフォ   JPUG PHPcon PHPcon
   セキュリティ      W/S API      10周年 AJAX             10周年 関西     北海道
開発のソーシャルコーディング対応

 2012/3 ソースコードの管理をsubversionからgitへ移行
 git.php.net → githubにミラー

                             PHPソースをクローン                     新機能
バグ修正
                                                              RFC作成
 バグトラッカで検索                   実装+テストコード作成
                    #12345                                    議論/更新
 登録                          pullリクエスト発行
 (チケット取得)
                                                               投票
  http://bugs.php.net             議論/更新
                                                             http://wiki.php.net/rfc

                             リクエスト受理/拒否

                             http://github.com/php/php-src
フレームワークと相互運用性

 相互運用性               フレームワークA     ORMクラスC
  interoperability                ViewクラスD

                                  独自クラスE

  モジュラー              フレームワークB     ORMクラスC

                                  ViewクラスF

                                  独自クラスE

PHP 5.3時代のフレームワーク(名前空間)


   FuelPHP 1.2         Symfony2      ZF 2
PHP-FIG と PSR
                                  http://www.php-fig.org/
 PHP Framework Interoperability Group (PHP-FIG)
  (以前: PHP Standards Working Group)
 主要F/W関係者が参画: CakePHP, ZF,Symfony, ...
 PHP standards recommendation (PSR)を発行

PSR-0 :ファイル/クラス/名前空間の標準化:autoloader
PSR-1 : 基本的なコーディング標準
PSR-2 : コーディングスタイルガイド

          プロジェクトをPSR準拠とする

          効率的で柔軟な運用が可能に
PSR準拠とするには?

1.PHP Coding Standards Fixer (http://cs.sensiolabs.org/)
  PSR-0~2準拠となるよう修正
  $ wget http://cs.sensiolabs.org/get/php-cs-fixer.phar

  $ php php-cs-fixer.phar fix /path/to/dir


2.PHP_CodeSnifferで確認

  $ pear install PHP_CodeSniffer
  $ cd /usr/share/php/CodeSniffer/Standards
  $ git clone https://github.com/klaussilveira/phpcs-psr PSR
  $ phpcs --config-set default_standard PSR
依存性マネージャ:Composer

 パッケージマネージャ → dependency manager
    プロジェクト単位で複数/階層的な依存関係を解決
 主要フレームワークに対応 : Symfony2, ZF, FuelPHP, ...


    composer.jsonに依存性を記述
    composer.jsonに依存性を記述                       composer.jsonの例
                                        {
                                            "require": {
    パッケージのインストール                               "twig/twig": "1.6.*",
    パッケージのインストール                               "slim/slim": "1.6.*",
          $ php composer.phar install       }
                オートローダとロックファイル          }
                (composer.lock)自動生成
   依存性を更新
   依存性を更新          (デフォルト:バージョンをロック)
         $ php composer.phar update
Packagist:Composerによる配布




      http://packagist.org/statistics
PHP 5.4 改善/変更のポイント

 速度改善:10%~15%
 Mix-inライクな機能を実現:Trait
 古い機能の削除:
 register_globals, magic_quotes*, safe_mode* , ext/sqlite, ...
 ZEマルチバイト標準化、mbstring機能強化
 組込みWebサーバー: php -S localhost:8080
 課題: APCのサポートがまだβ版
PHP 5.4でより速く、快適に
 大幅に高速化、省メモリ化
                                     Zend/bench.php              strcat(200000)
             6
                                                                 sieve(30)
                                                                 nestedloop(12)
             5                                                   matrix(20)
                                                                 heapsort(20000)
                                                                 hash2(500)
             4                                                   hash1(50000)
  実行時間 [s]




                                                                 fibo(30)
             3                                                   ary3(2000)
                                                                 ary2(50000)
                                                                 ary(50000)
             2                                                   ackermann(7)
                                                                 mandel2
                                                                 mandel
             1                                                   simpleudcall
                                                                 simpleucall
             0                                                   simplecall
                 PHP 5.2   PHP 5.3      PHP 5.4       PHP 5.5    simple


                                               Athlon II X4 640 3.0GHz, Ubuntu 12.04
PHP 5.4でより速く、快適に
 大幅に高速化、省メモリ化
                                                                  $x = $f ? $f : tmp
                               Zend/micro_bench.php               $x = $f ? $f : $a
            40                                                    $x = $f ?: tmp
                                                                  $x = $a ?: null
                                                                  $x = $str[0]
                                                                  $x = $hash['v']
            35
                                                                  $x = $GLOBALS['v']
                                                                  $x = $_GET
                                                                  $x = TEST
            30                                                    new Foo()
                                                                  $x = Foo::TEST
                                                                  $this->f()
                                                                  empty($this->x)
            25                                                    isset($this->x)
                                                                  $this->x--
                                                                  $this->x++
 実行時間 [s]




                                                                  --$this->x
            20                                                    ++$this->x
                                                                  $this->x += 2
                                                                  $this->x = 0
                                                                  $x = $this->x
            15                                                    Foo::f()
                                                                  self::f()
                                                                  empty(Foo::$x)
                                                                  isset(Foo::$x)
            10                                                    Foo::$x = 0
                                                                  $x = Foo::$x
                                                                  empty(self::$x)
                                                                  isset(self::$x)
             5                                                    self::$x = 0
                                                                  $x = self::$x
                                                                  int_func()
                                                                  undef_func()
             0
                 PHP 5.2   PHP 5.3      PHP 5.4   Athlon II5.5 640 3.0GHz, Ubuntu 12.04
                                                       PHP X4
                                                                  func()
                                                                  empty_loop
PHP 5.4 でコード再利用:Trait

 Trait: 単一継承の言語でコードを再利用する仕組み
 実装の再利用( ≠ interface:実装を強制)
 クラスや他のTraitとのメソッド名衝突を解決する仕組みが必要
<?php                                            <?php
trait A {                                        trait A {
  public function show() {                         public function show() { echo 'Hello,';} }
        echo 'Hello,',$this->getName(),'!'; }
  abstract public function getName();            trait B {
}                                                  public function show() {echo 'PHP!';} }

class Base { /* 1 */ }                           class Foo {
                                                   use A, B {
class Foo extends Base {                             A::show insteadof B;   リネームでは
     use A;                                          B::show as showN; }    なくエイリアス
     public function getName() { echo 'PHP'; }   }
}
$obj = new Foo();                                $obj = new Foo();
echo $obj->show(); // Hello,PHP!                 echo $obj->show() . $obj->showN();
PHP 5.4 で日本語の扱いが便利に

 Zendエンジンマルチバイト対応標準化:バイナリ互換性改善
     PHP <= 5.3
        ◇ PHP構築時: --enable-zend-multibyte --enable-mbstring
        ◇ mbstring.script_encoding でスクリプト文字コード指定

     PHP 5.4
        ◇ zend.multibyte = On で有効に
        ◇ zend.script_encodingでスクリプト文字コード指定

 デフォルト文字コードがISO-8859-1からUTF-8に:
  default_charset, htmlspecialchars(), etc.
 mbstring文字コード追加: 携帯絵文字(Unicode 6), etc.
PHP 5.4.1:コールバック関数による置換

 正規表現置換eオプション:セキュリティホールとなりやすい
mb_ereg_replace_callback()関数追加
  → 置換文字列で コールバック関数を使用可能に
 PCREにおけるpreg_replace_callback()に相当

   $str = 'abc 123 #';
   echo mb_ereg_replace('(S+)',"strlen('1')", $str, 'e');


  echo mb_ereg_replace_callback('(S+)',
     function ($m) { echo strlen($m[0]);}, $str);
PHP 5.5

 リリース時期: 未定 (2013/3 ?)
 PHP 5.3、5.4と比べて小幅な改訂となる可能性がある
 目玉機能は、(今のところ) Generator
Generator
                                     (https://wiki.php.net/rfc/generators)
   Generator:イテレータを関数で定義(Python)
   例:ファイルの各行を処理: ファイル全体読込み→メモリが大量に必要
   イタレータ定義:多くのコード記述が必要
   配列全体を返すのではなく、値を生成するイタレータを返す

     <?php                                           Nikita Popov
     function xrange($start, $end, $step = 1) {
       for ($i = $start; $i < $end; $i += $step) {   17歳、ベルリン
          yield $i;
       }
     }

     foreach (xrange(10, 20) as $i) {
        echo $i;
                      10,11,....,20
     }
finallyキーワード
                               (https://wiki.php.net/rfc/finally)
 finallyブロック:tryブロックから出る際に常に実行される
 例外発生の有無によらない → クリンナップコードを記述
 return等でクリンナップコードがバイパスされることを防止


       try {
           echo ”1";
            throw new Exception("ex");
       } catch (Exception $e) {
            echo ”2";
       } finally {
            echo "#";
       }                                 12#
パスワード用ハッシュ

 パスワードハッシュ用API                  (https://wiki.php.net/rfc/password_hash)

 crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった
   $hash = password_hash($password, PASSWORD_BCRYPT);


      echo password_verify($password, $hash) ? "OK" : "NG";

 PBKDF2: パスワードハッシュ用キーストレッチ
  $key = hash_pbkdf2("sha512", $password, $salt, 5000, 16, true);
  $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
                  $key, $data, MCRYPT_MODE_CBC, $iv);

                                 scrypt に基づく実装も提案されている
その他の機能(1)

 配列/文字列定数の添字参照
                              (https://wiki.php.net/rfc/constdereference)
  echo ”123”[1]; 2                   ランダムな16進文字列を生成する例
  echo [1,2,3][2]; 3              function randomHexString($length) {
                                     for ($i = 0, $s = ''; $i < $length; ++$i) {
                                        $s .= "0123456789abcdef"[mt_rand(0, 15)];
                                     }
                                     return $s;
                                  }
                                  echo randomHexString(10);  1e1384a471

 foreachでリスト代入が可能に                           (https://wiki.php.net/rfc/foreachlist)
foreach ($users as $user) {              foreach ($users as list($id, $name)) {
  list($id, $name) = $user;                echo “$id => $name”;
  echo “$id => $name”;                   }
}
PHPの成功と未来
 Rasmus語録
  (http://en.wikiquote.org/wiki/Rasmus_Lerdorf)
 PHPは歯ブラシのようなもの。いつも使う役に立つシンプルな
 ツールだけど、誰も歯ブラシのことなんて気にしないよね。
 PHPは「問題を解くためのシンプルなツール」なのさ。

学習が容易: 言語がシンプル、ドキュメントが豊富
- 多様な要求に応えつつ、わかり易さを保つことが必要
- 地道な活動が重要: ローカルなPHPカンファレンス、勉強会、等
進化を継続: Webの進化に対応し、必要十分な解を提供
- 開発者/貢献者の育成
- キラーアプリ(WordPressなど)の存在がキー
日本PHPユーザ会
設立趣旨
 (2000年4月発足)            活動内容
PHPユーザ相互の情報交換および        Web
コミュニティの健全な発展                   http://www.php.gr.jp/
                         メーリングリスト
背景                      php-users, php-dev, php-doc,
                        phpug-admin
• 高性能Webミドルウエアへのニーズ増大
• オープンソースソフトウエアの発展       ドキュメント整備

                        セミナー/イベント
  国内PHPユーザの増加
                            国際化
メンバー/スタッフ

・PHPユーザ会員と思ったらメンバー
・運営するのも楽しいかも

PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

  • 1.
  • 2.
    ポスト5.3時代のコード  マイクロフレームワークSlimの例  モジュラーデザイン:名前空間、オートローダー http://www.example.com/hello/taro http://www.example.com/hello/taro Hello, taro Hello, taro <?php Composed Composed require 'vendor/autoload.php'; $app = new SlimSlim(); 名前空間 名前空間 $app->get('/hello/:name', function ($name) use ($app) { $app->render('tpl1.php', array('name'=> $name)); 無名関数 無名関数 }); $app->run(); [tpl1.php] [tpl1.php] Hello, <?= $name; ?> Hello, <?= $name; ?>
  • 3.
    PHP アンケート 2012  主に使っているPHPのバージョン 1) PHP 4.x 2) PHP 5.0-5.1 3) PHP 5.2 4) PHP 5.3 5) PHP 5.4 6) 使ってない
  • 4.
    PHPユーザ分布 usage of server-sideprogramming language (2012/9/8) 0.2% 0.6% 0.9% 1.2% 4.0% 21.2% PHP ASP.NET Java ColdFusion Perl Ruby Market Share of CMS 77.9% 22.8% WordPress Joomla 3.3% Drupal 54.3% 3.7% vBulletin 7.0% Blogger 8.9% other 引用: W3Techs.com, 2012/9/8版
  • 5.
    PHPユーザ分布 Version of PHP(2012/9/8, W3Techs.com) 4.3% PHP 5 PHP 4 version of PHP 5 (2012/9/8, W3Techs.com) 4.1% 0.7% 95.7% 5.1 36.5% 5.2 5.3 5.4 58.6% 引用: W3Techs.com, 2012/9/8版
  • 6.
    バージョンを更新する/しない理由 「開発リソースの有効活用」とサポートの両立が課題 更新する理由 更新しない理由 ・新機能/性能が魅力的 ・新機能/性能が魅力的 ・更新/確認の手間 ・更新/確認の手間 ・セキュリティ/バグ修正 ・セキュリティ/バグ修正 ・新機能/性能の魅力小 ・新機能/性能の魅力小 ・サポート切れ ・サポート切れ ・周辺環境の更新が追いつかない ・周辺環境の更新が追いつかない
  • 7.
    PHPの歩み `10/3 キャンセル 6.0 5.5 ・Unicode `12/3 ・エンジン/OOP大幅強化:ZE2 `09/6 5.4 ・XML対応強化(SimpleXML) 5.3 ・Traits ・Webサービス(SOAP) - 速度改善 ・DB強化 (SQLite, MySQLi) `06/11 ・名前空間 - MB対応標準化 ・クロージャ `05/11 5.2 ・遅延静的束縛 - 組込みWebサーバ - レガシー機能削除 5.1 ・メモリ/速度改善 ・GC改善 `04/7 ・MySQLnd ・速度改善 ・入力フィルタ 5.0 ・PDO `02/12 `05/6 4.3 4.4 `10/12 (EOL) `08/8 (EOL) ・CLI ・バグ修正 ・stream ・自動グローバル変数のデフォルト無効化 ・mbregex ・zend-multibyte 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 Web/DB XML PHP フレームワーク スマフォ JPUG PHPcon PHPcon セキュリティ W/S API 10周年 AJAX 10周年 関西 北海道
  • 8.
    開発のソーシャルコーディング対応  2012/3 ソースコードの管理をsubversionからgitへ移行  git.php.net →githubにミラー PHPソースをクローン 新機能 バグ修正 RFC作成 バグトラッカで検索 実装+テストコード作成 #12345 議論/更新 登録 pullリクエスト発行 (チケット取得) 投票 http://bugs.php.net 議論/更新 http://wiki.php.net/rfc リクエスト受理/拒否 http://github.com/php/php-src
  • 9.
    フレームワークと相互運用性 相互運用性 フレームワークA ORMクラスC interoperability ViewクラスD 独自クラスE モジュラー フレームワークB ORMクラスC ViewクラスF 独自クラスE PHP 5.3時代のフレームワーク(名前空間) FuelPHP 1.2 Symfony2 ZF 2
  • 10.
    PHP-FIG と PSR http://www.php-fig.org/  PHP Framework Interoperability Group (PHP-FIG)   (以前: PHP Standards Working Group)  主要F/W関係者が参画: CakePHP, ZF,Symfony, ...  PHP standards recommendation (PSR)を発行 PSR-0 :ファイル/クラス/名前空間の標準化:autoloader PSR-1 : 基本的なコーディング標準 PSR-2 : コーディングスタイルガイド プロジェクトをPSR準拠とする 効率的で柔軟な運用が可能に
  • 11.
    PSR準拠とするには? 1.PHP Coding StandardsFixer (http://cs.sensiolabs.org/) PSR-0~2準拠となるよう修正 $ wget http://cs.sensiolabs.org/get/php-cs-fixer.phar $ php php-cs-fixer.phar fix /path/to/dir 2.PHP_CodeSnifferで確認 $ pear install PHP_CodeSniffer $ cd /usr/share/php/CodeSniffer/Standards $ git clone https://github.com/klaussilveira/phpcs-psr PSR $ phpcs --config-set default_standard PSR
  • 12.
    依存性マネージャ:Composer  パッケージマネージャ →dependency manager  プロジェクト単位で複数/階層的な依存関係を解決  主要フレームワークに対応 : Symfony2, ZF, FuelPHP, ... composer.jsonに依存性を記述 composer.jsonに依存性を記述 composer.jsonの例 { "require": { パッケージのインストール "twig/twig": "1.6.*", パッケージのインストール "slim/slim": "1.6.*", $ php composer.phar install } オートローダとロックファイル } (composer.lock)自動生成 依存性を更新 依存性を更新 (デフォルト:バージョンをロック) $ php composer.phar update
  • 13.
    Packagist:Composerによる配布 http://packagist.org/statistics
  • 14.
    PHP 5.4 改善/変更のポイント 速度改善:10%~15%  Mix-inライクな機能を実現:Trait  古い機能の削除: register_globals, magic_quotes*, safe_mode* , ext/sqlite, ...  ZEマルチバイト標準化、mbstring機能強化  組込みWebサーバー: php -S localhost:8080  課題: APCのサポートがまだβ版
  • 15.
    PHP 5.4でより速く、快適に  大幅に高速化、省メモリ化 Zend/bench.php strcat(200000) 6 sieve(30) nestedloop(12) 5 matrix(20) heapsort(20000) hash2(500) 4 hash1(50000) 実行時間 [s] fibo(30) 3 ary3(2000) ary2(50000) ary(50000) 2 ackermann(7) mandel2 mandel 1 simpleudcall simpleucall 0 simplecall PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.5 simple Athlon II X4 640 3.0GHz, Ubuntu 12.04
  • 16.
    PHP 5.4でより速く、快適に  大幅に高速化、省メモリ化 $x = $f ? $f : tmp Zend/micro_bench.php $x = $f ? $f : $a 40 $x = $f ?: tmp $x = $a ?: null $x = $str[0] $x = $hash['v'] 35 $x = $GLOBALS['v'] $x = $_GET $x = TEST 30 new Foo() $x = Foo::TEST $this->f() empty($this->x) 25 isset($this->x) $this->x-- $this->x++ 実行時間 [s] --$this->x 20 ++$this->x $this->x += 2 $this->x = 0 $x = $this->x 15 Foo::f() self::f() empty(Foo::$x) isset(Foo::$x) 10 Foo::$x = 0 $x = Foo::$x empty(self::$x) isset(self::$x) 5 self::$x = 0 $x = self::$x int_func() undef_func() 0 PHP 5.2 PHP 5.3 PHP 5.4 Athlon II5.5 640 3.0GHz, Ubuntu 12.04 PHP X4 func() empty_loop
  • 17.
    PHP 5.4 でコード再利用:Trait Trait: 単一継承の言語でコードを再利用する仕組み  実装の再利用( ≠ interface:実装を強制)  クラスや他のTraitとのメソッド名衝突を解決する仕組みが必要 <?php <?php trait A { trait A { public function show() { public function show() { echo 'Hello,';} } echo 'Hello,',$this->getName(),'!'; } abstract public function getName(); trait B { } public function show() {echo 'PHP!';} } class Base { /* 1 */ } class Foo { use A, B { class Foo extends Base { A::show insteadof B; リネームでは use A; B::show as showN; } なくエイリアス public function getName() { echo 'PHP'; } } } $obj = new Foo(); $obj = new Foo(); echo $obj->show(); // Hello,PHP! echo $obj->show() . $obj->showN();
  • 18.
    PHP 5.4 で日本語の扱いが便利に Zendエンジンマルチバイト対応標準化:バイナリ互換性改善 PHP <= 5.3 ◇ PHP構築時: --enable-zend-multibyte --enable-mbstring ◇ mbstring.script_encoding でスクリプト文字コード指定 PHP 5.4 ◇ zend.multibyte = On で有効に ◇ zend.script_encodingでスクリプト文字コード指定  デフォルト文字コードがISO-8859-1からUTF-8に: default_charset, htmlspecialchars(), etc.  mbstring文字コード追加: 携帯絵文字(Unicode 6), etc.
  • 19.
    PHP 5.4.1:コールバック関数による置換  正規表現置換eオプション:セキュリティホールとなりやすい mb_ereg_replace_callback()関数追加   →置換文字列で コールバック関数を使用可能に  PCREにおけるpreg_replace_callback()に相当 $str = 'abc 123 #'; echo mb_ereg_replace('(S+)',"strlen('1')", $str, 'e'); echo mb_ereg_replace_callback('(S+)', function ($m) { echo strlen($m[0]);}, $str);
  • 20.
    PHP 5.5  リリース時期: 未定(2013/3 ?)  PHP 5.3、5.4と比べて小幅な改訂となる可能性がある  目玉機能は、(今のところ) Generator
  • 21.
    Generator (https://wiki.php.net/rfc/generators)  Generator:イテレータを関数で定義(Python)  例:ファイルの各行を処理: ファイル全体読込み→メモリが大量に必要  イタレータ定義:多くのコード記述が必要  配列全体を返すのではなく、値を生成するイタレータを返す <?php Nikita Popov function xrange($start, $end, $step = 1) { for ($i = $start; $i < $end; $i += $step) { 17歳、ベルリン yield $i; } } foreach (xrange(10, 20) as $i) { echo $i; 10,11,....,20 }
  • 22.
    finallyキーワード (https://wiki.php.net/rfc/finally)  finallyブロック:tryブロックから出る際に常に実行される  例外発生の有無によらない → クリンナップコードを記述  return等でクリンナップコードがバイパスされることを防止 try { echo ”1"; throw new Exception("ex"); } catch (Exception $e) { echo ”2"; } finally { echo "#"; } 12#
  • 23.
    パスワード用ハッシュ  パスワードハッシュ用API (https://wiki.php.net/rfc/password_hash) crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった $hash = password_hash($password, PASSWORD_BCRYPT); echo password_verify($password, $hash) ? "OK" : "NG";  PBKDF2: パスワードハッシュ用キーストレッチ $key = hash_pbkdf2("sha512", $password, $salt, 5000, 16, true); $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,    $key, $data, MCRYPT_MODE_CBC, $iv); scrypt に基づく実装も提案されている
  • 24.
    その他の機能(1)  配列/文字列定数の添字参照 (https://wiki.php.net/rfc/constdereference) echo ”123”[1]; 2 ランダムな16進文字列を生成する例 echo [1,2,3][2]; 3 function randomHexString($length) { for ($i = 0, $s = ''; $i < $length; ++$i) { $s .= "0123456789abcdef"[mt_rand(0, 15)]; } return $s; } echo randomHexString(10);  1e1384a471  foreachでリスト代入が可能に (https://wiki.php.net/rfc/foreachlist) foreach ($users as $user) { foreach ($users as list($id, $name)) { list($id, $name) = $user; echo “$id => $name”; echo “$id => $name”; } }
  • 25.
    PHPの成功と未来 Rasmus語録 (http://en.wikiquote.org/wiki/Rasmus_Lerdorf) PHPは歯ブラシのようなもの。いつも使う役に立つシンプルな ツールだけど、誰も歯ブラシのことなんて気にしないよね。 PHPは「問題を解くためのシンプルなツール」なのさ。 学習が容易: 言語がシンプル、ドキュメントが豊富 - 多様な要求に応えつつ、わかり易さを保つことが必要 - 地道な活動が重要: ローカルなPHPカンファレンス、勉強会、等 進化を継続: Webの進化に対応し、必要十分な解を提供 - 開発者/貢献者の育成 - キラーアプリ(WordPressなど)の存在がキー
  • 26.
    日本PHPユーザ会 設立趣旨 (2000年4月発足) 活動内容 PHPユーザ相互の情報交換および Web コミュニティの健全な発展 http://www.php.gr.jp/ メーリングリスト 背景 php-users, php-dev, php-doc, phpug-admin • 高性能Webミドルウエアへのニーズ増大 • オープンソースソフトウエアの発展 ドキュメント整備 セミナー/イベント 国内PHPユーザの増加 国際化 メンバー/スタッフ ・PHPユーザ会員と思ったらメンバー ・運営するのも楽しいかも