PHP5.4勉強会
                                   株式会社シーエーアドバンス
                                           大谷 祐司




Copyright © CyberAgent .inc 2011               1
自己紹介



                           大谷 祐司(おおたに ゆうじ)
                           --------------------------------------
                           株式会社シーエー・アドバンス 技術責任者。
                           技術大好き、プログラム大好きです。

                           山口県出身で、現在は東京在住。
                           沖縄が大好きで毎月来ています。
                           (ホテルとオフィスの往復がほとんどですが・・・)

                           9月で32歳になります。




Copyright © CA ADvance .inc 2012                                    2
自己紹介




                     参加者の皆さんにも自己紹介してもらいましょう。




Copyright © CA ADvance .inc 2012               3
自己紹介




                     シーエーアドバンスの社内勉強会を外部解放するというコン
                     セプトで、今日の勉強会は企画されました。

                     弊社では、定期的に技術に関する勉強会を行っています。
                     興味を持った方は、「エグジニアブログ」で検索してみ
                     てください。




Copyright © CA ADvance .inc 2012                   4
自己紹介




                     初めての試みですが、失敗を恐れずに頑張ります!
                     皆さんにとって有意義な勉強会になれば幸いです。




Copyright © CA ADvance .inc 2012               5
はじめに




      ■今日のテーマ

      3月に安定板がリリースされたPHP5.4です。




Copyright © CA ADvance .inc 2012   6
今日の内容




                      以下についてお話しします。

                      ■PHP5.4の新機能

                      ■PHP5.3→5.4のバージョンアップについて

                      ■弊社のバージョンアップ事例




Copyright © CA ADvance .inc 2012                 7
今日の内容




                      PHP5.4 もう導入していますか?




Copyright © CA ADvance .inc 2012           8
PHP5.4の新機能




              PHP5.4開発時に、PHP6にするか検討したらしいです。

              それくらい大きく変わっていました・・・




Copyright © CA ADvance .inc 2012              9
PHP5.4の新機能

                            新機能がたくさん・・・
                            ■配列をメソッドチェーンのように参照可能

                            ■callable配列をそのまま実行可能

                            ■クロージャの中で$thisが使える

                            ■Traitsのサポート

                            ■配列のシンタックスシュガー

                            ■staticメソッドの可変呼び出し

                            ■callableが型ヒントに使える

                            ■コンストラクタからメソッドチェーンが実行可能

                            ■ビルトインWEBサーバ

                            今日はこれらを、詳しく解説します。

Copyright © CA ADvance .inc 2012                      10
PHP5.4の新機能

                 ■配列をメソッドチェーンのように参照可能

                 PHP5.3まではこう書く必要がありましたが、

                 $a = new A();
                 $row = $a->foo();
                 echo $row['name'];


                 PHP5.4だとこう書けばOKです。

                 $a = new A();
                 echo $a->foo()['name'];




Copyright © CA ADvance .inc 2012           11
PHP5.4の新機能

                 ■ callable配列をそのまま実行可能

                 callable配列( array(‘class’, ‘method’))を
                 そのまま実行出来るようになりました。

                 $f = array('Foo','bar');
                 echo $f('TEST');




Copyright © CA ADvance .inc 2012                          12
PHP5.4の新機能

                 ■クロージャの中で$thisが使える

                 php5.3までは、「Fatal error: Using $this when
                 not in object context」が出ましたが、PHP5.4では
                 問題なく実行されます。

                 class A {
                     private $value = ‘文字列A';
                     function single_getter($name) {
                         return function() use ($name) {
                                return $this->$name;
                         };
                     }
                 }




Copyright © CA ADvance .inc 2012                            13
PHP5.4の新機能

                 ■Traitのサポート

                 ・Traitとは、クラスの継承関係に影響を与えずクラスに適用で
                 きるメソッドとプロパティの集合です。

                 ・trait本体は、class XXXのように trait XXX と作成します。呼
                 び出す際は、クラス内で use XXX と宣言します。




Copyright © CA ADvance .inc 2012                              14
PHP5.4の新機能

                 ■Traitsのサンプルコード

                 trait Hello {
                         public function sayHelloWorld() {
                                echo 'Hello'.$this->getWorld();
                         }
                         abstract public function getWorld();
                 }
                 class MyHelloWorld {
                     private $world;
                     use Hello;
                     public function getWorld() {
                         return $this->world;
                     }
                     public function setWorld($val) {
                         $this->world = $val;
                     }
                 }

Copyright © CA ADvance .inc 2012                                  15
PHP5.4の新機能

                 ■配列のシンタックスシュガー

                 他の言語のように配列の簡単な初期化がサポートされます。

                 PHP5.3まではこう書く必要がありましたが、
                 $a = array('A', ‘B', ‘C');
                 $b = array('A' =>‘contentsA',
                              ‘B'=>‘contentsB',
                              ‘C'=>‘contentsC');

                 PHP5.4だとこう書けばOKです。
                 $a = ['A', ‘B', ‘C'];
                 $b = ['A' => ‘contentsA',
                     ‘B' => ‘contentsB',
                     ‘C' => ‘contentsC'];




Copyright © CA ADvance .inc 2012                   16
PHP5.4の新機能

                 ■ staticメソッドの可変呼び出し

                 波括弧を使いstaticメソッドの呼び出しを可変に出来
                 ます。

                 class StaticClass {
                     public static function getName() {
                         return ‘名前';
                     }
                 }
                 $method = 'getName';
                 echo StaticClass::{$method}(); //「名前」と表示
                 される。




Copyright © CA ADvance .inc 2012                            17
PHP5.4の新機能

                 ■ callableが型ヒントに使える

                 function hi(callable $f) {
                     echo $f();
                 }
                 class Human
                 {
                     public function hello() {
                         return “文字1";
                     }
                 }
                 hi([new Human(), ‘hello’]); //「文字1」が表示される。

                 $songName = function() {
                     return “文字2";
                 };
                 hi($songName); //「文字2」が表示される。


Copyright © CA ADvance .inc 2012                              18
PHP5.4の新機能

                 ■コンストラクタからメソッドチェーンが実行可能

                 class Human{
                     function __construct($name) {
                         $this->name = $name;
                     }
                     public function hello() {
                         return "Hi " . $this->name;
                     }
                 }

                 // 古い方法
                 $human = new Human(“文字1");
                 echo $human->hello();

                 // 新しい方法
                 echo (new Human("文字1"))->hello();


Copyright © CA ADvance .inc 2012                       19
PHP5.4の新機能

                 ■ビルトインWebサーバ

                 PHPだけでWebサービスを提供できる機能です。起動し
                 たディレクトリが ドキュメントルートになります。
                 Apacheが持っているSSIなどの機能は使えず、飽くま
                 でPHPを試すためのものです。




Copyright © CA ADvance .inc 2012                20
PHP5.4の新機能




                   かなりたくさんありましたね。覚えるのが大変そうです・・・

                   便利な機能も多いので、使いこなせるようになりたいですね!




Copyright © CA ADvance .inc 2012                  21
PHP5.4の新機能




                   次はPHP5.3→5.4のバージョンアップについて見ていきましょう。




Copyright © CA ADvance .inc 2012                        22
PHP5.3→5.4のバージョンアップについて




                  ■とりあえず移行ガイドを見てみる。
                  http://php.net/manual/ja/migration54.php

                  PHP 5.4.x で改良された点のほどんどは、既存のコードに影響
                  を及ぼしません。

                  →おぉ、素晴らしい!!




Copyright © CA ADvance .inc 2012                             23
PHP5.3→5.4のバージョンアップについて


               移行ガイドを見てみると、下位互換性のない変更点がたくさんあ
               ります・・・

               http://www.php.net/manual/ja/migration54.incompatible.php

    セーフモード をサポートしなくなりました。セーフモードでの動作を前提とするアプリケーションは、 セキュリティに関する調整が必要となります。
    ■マジッククォート が削除されました。 この機能に依存するアプリケーションは、依存しないように修正しないとセキュリティの問題が発生します。
    get_magic_quotes_gpc() と get_magic_quotes_runtime()は常に FALSE を返すようになりました。 set_magic_quotes_runtime() を実行すると E_CORE_ERROR が発生
    します。
    ■ini 設定 register_globals と register_long_arraysが削除されました。
    ■呼び出し時の参照渡しをサポートしなくなりました。
    ■breakと continueへの引数として、変数は使えなくなりました。つまり、 break 1 + foo() * $bar; などとは書けなくなったということです。 静的な引数を使う
    のはもちろん可能で、break 2; などは使えます。 この変更の副作用として、 break 0; や continue 0; が使えなくなりました。
    ■Date 拡張モジュールにおいて、TZ 環境変数によるタイムゾーンの設定をサポートしなくなりました。 php.ini 設定 date.timezone あるいは
    date_default_timezone_set()関数でタイムゾーンを指定しなければなりません。 デフォルトのタイムゾーンが設定されていない場合に推測することがなくなり、 未
    設定の場合は常に "UTC" とみなして E_WARNING を発生させるようになりました。
    ■$a が文字列の場合に非数値のオフセット (たとえば $a['foo']) を指定したときの isset() の返り値は false、 そして empty() の返り値は true となりました。
    そして同時に E_WARNING が発生します。オフセットに double や bool そして null を指定した場合は E_NOTICE が発生します。数値とみなせる文字列を渡した場合
    ($a['2'] など) の挙動はこれまでと変わりません。 '12.3' や '5 foobar' のようなオフセットは非数値とみなされて E_WARNINGが発生しますが、過去との互換性の
    ためにそれぞれ 12 および 5 に変換されることに注意しましょう。 次のようなコードの返す値が変わります。 $str='abc';var_dump(isset($str['x'])); // PHP
    5.4 以降では false、5.3 以前のバージョンでは true
    ■配列を文字列に変換しようとすると E_NOTICE が発生するようになりました。 キャストの結果は "Array" で、以前と変わりません。
    ■NULL、FALSE あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのような E_STRICT エラーではなく warning が発生するよ
    うになりました。
    ■スーパーグローバルをパラメータ名として使うと fatal error となります。つまり function foo($_GET, $_POST) {} などのコードは使えなくなります。
    ■ハッシュアルゴリズム Salsa10 および Salsa20 が削除されました。
    ■array_combine() のパラメータとして空の配列を二つ指定したときの返り値が FALSE ではなく array() となりました。
    ■htmlentities() は、アジアの文字に対して使ったときに E_STRICT を発行するようになりました。この場合の htmlentities() の挙動が htmlspecialchars() (こ
    ちらは以前からそうなっていた) と同じになりました。




Copyright © CA ADvance .inc 2012                                                                                                   24
PHP5.3→5.4のバージョンアップについて



                              特にやばそうなもの。


    ■呼び出し時の参照渡しをサポートしなくなりました。
    ■$a が文字列の場合に非数値のオフセット (たとえば $a['foo']) を指定したときの isset() の返り値は false、 そして
    empty() の返り値は true となりました。 そして同時に E_WARNING が発生します。

    ■配列を文字列に変換しようとすると E_NOTICE が発生するようになりました。 キャストの結果は "Array" で、以前と変
    わりません。

    ■NULL、FALSE あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのような
    E_STRICT エラーではなく warning が発生するようになりました。




Copyright © CA ADvance .inc 2012                                               25
PHP5.3→5.4のバージョンアップについて


             シーエーアドバンスでもPHP5.4に取り組もうとしました。

             対象は、インターネット広告運用のプラットフォーム。
             オレオレフレームワークです。




Copyright © CA ADvance .inc 2012             26
PHP5.3→5.4のバージョンアップについて


             広告運用プラットフォーム
             →オレオレフレームワーク。

             参照渡しがたくさん→気合いで修正。
             Depricatedがたくさん→とりあえず無視。

             何とか動くようになったと思ったら・・・




Copyright © CA ADvance .inc 2012        27
PHP5.3→5.4のバージョンアップについて


             開発機(ローカルWindows)のmemcacheが動かない・・・
             PHP5.4版のphp_memcache.dllをネットで探すも見つからず。

             →バージョンアップは一旦断念。
              残念!!!!!




Copyright © CA ADvance .inc 2012                      28
総括


             許されるなら、早くPHP5.4に切り替えた方が良いと思います。

             ・大幅なメモリ使用量の削減
             (43%削減されるというデータがあるそうです)

             ・実行速度のUP
             (あるテストでは、25%高速化されているという結果も)

             ・新機能を使うことによる、コード量の削減→見やすいコードに

             などなど、新しいものには素晴らしい部分がたくさんあります。




Copyright © CA ADvance .inc 2012               29
ご清聴ありがとうございました。




Copyright © CA ADvance .inc 2012                     30

Php5 4勉強会

  • 1.
    PHP5.4勉強会 株式会社シーエーアドバンス 大谷 祐司 Copyright © CyberAgent .inc 2011 1
  • 2.
    自己紹介 大谷 祐司(おおたに ゆうじ) -------------------------------------- 株式会社シーエー・アドバンス 技術責任者。 技術大好き、プログラム大好きです。 山口県出身で、現在は東京在住。 沖縄が大好きで毎月来ています。 (ホテルとオフィスの往復がほとんどですが・・・) 9月で32歳になります。 Copyright © CA ADvance .inc 2012 2
  • 3.
    自己紹介 参加者の皆さんにも自己紹介してもらいましょう。 Copyright © CA ADvance .inc 2012 3
  • 4.
    自己紹介 シーエーアドバンスの社内勉強会を外部解放するというコン セプトで、今日の勉強会は企画されました。 弊社では、定期的に技術に関する勉強会を行っています。 興味を持った方は、「エグジニアブログ」で検索してみ てください。 Copyright © CA ADvance .inc 2012 4
  • 5.
    自己紹介 初めての試みですが、失敗を恐れずに頑張ります! 皆さんにとって有意義な勉強会になれば幸いです。 Copyright © CA ADvance .inc 2012 5
  • 6.
    はじめに ■今日のテーマ 3月に安定板がリリースされたPHP5.4です。 Copyright © CA ADvance .inc 2012 6
  • 7.
    今日の内容 以下についてお話しします。 ■PHP5.4の新機能 ■PHP5.3→5.4のバージョンアップについて ■弊社のバージョンアップ事例 Copyright © CA ADvance .inc 2012 7
  • 8.
    今日の内容 PHP5.4 もう導入していますか? Copyright © CA ADvance .inc 2012 8
  • 9.
    PHP5.4の新機能 PHP5.4開発時に、PHP6にするか検討したらしいです。 それくらい大きく変わっていました・・・ Copyright © CA ADvance .inc 2012 9
  • 10.
    PHP5.4の新機能 新機能がたくさん・・・ ■配列をメソッドチェーンのように参照可能 ■callable配列をそのまま実行可能 ■クロージャの中で$thisが使える ■Traitsのサポート ■配列のシンタックスシュガー ■staticメソッドの可変呼び出し ■callableが型ヒントに使える ■コンストラクタからメソッドチェーンが実行可能 ■ビルトインWEBサーバ 今日はこれらを、詳しく解説します。 Copyright © CA ADvance .inc 2012 10
  • 11.
    PHP5.4の新機能 ■配列をメソッドチェーンのように参照可能 PHP5.3まではこう書く必要がありましたが、 $a = new A(); $row = $a->foo(); echo $row['name']; PHP5.4だとこう書けばOKです。 $a = new A(); echo $a->foo()['name']; Copyright © CA ADvance .inc 2012 11
  • 12.
    PHP5.4の新機能 ■ callable配列をそのまま実行可能 callable配列( array(‘class’, ‘method’))を そのまま実行出来るようになりました。 $f = array('Foo','bar'); echo $f('TEST'); Copyright © CA ADvance .inc 2012 12
  • 13.
    PHP5.4の新機能 ■クロージャの中で$thisが使える php5.3までは、「Fatal error: Using $this when not in object context」が出ましたが、PHP5.4では 問題なく実行されます。 class A { private $value = ‘文字列A'; function single_getter($name) { return function() use ($name) { return $this->$name; }; } } Copyright © CA ADvance .inc 2012 13
  • 14.
    PHP5.4の新機能 ■Traitのサポート ・Traitとは、クラスの継承関係に影響を与えずクラスに適用で きるメソッドとプロパティの集合です。 ・trait本体は、class XXXのように trait XXX と作成します。呼 び出す際は、クラス内で use XXX と宣言します。 Copyright © CA ADvance .inc 2012 14
  • 15.
    PHP5.4の新機能 ■Traitsのサンプルコード trait Hello { public function sayHelloWorld() { echo 'Hello'.$this->getWorld(); } abstract public function getWorld(); } class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; } } Copyright © CA ADvance .inc 2012 15
  • 16.
    PHP5.4の新機能 ■配列のシンタックスシュガー 他の言語のように配列の簡単な初期化がサポートされます。 PHP5.3まではこう書く必要がありましたが、 $a = array('A', ‘B', ‘C'); $b = array('A' =>‘contentsA', ‘B'=>‘contentsB', ‘C'=>‘contentsC'); PHP5.4だとこう書けばOKです。 $a = ['A', ‘B', ‘C']; $b = ['A' => ‘contentsA', ‘B' => ‘contentsB', ‘C' => ‘contentsC']; Copyright © CA ADvance .inc 2012 16
  • 17.
    PHP5.4の新機能 ■ staticメソッドの可変呼び出し 波括弧を使いstaticメソッドの呼び出しを可変に出来 ます。 class StaticClass { public static function getName() { return ‘名前'; } } $method = 'getName'; echo StaticClass::{$method}(); //「名前」と表示 される。 Copyright © CA ADvance .inc 2012 17
  • 18.
    PHP5.4の新機能 ■ callableが型ヒントに使える function hi(callable $f) { echo $f(); } class Human { public function hello() { return “文字1"; } } hi([new Human(), ‘hello’]); //「文字1」が表示される。 $songName = function() { return “文字2"; }; hi($songName); //「文字2」が表示される。 Copyright © CA ADvance .inc 2012 18
  • 19.
    PHP5.4の新機能 ■コンストラクタからメソッドチェーンが実行可能 class Human{ function __construct($name) { $this->name = $name; } public function hello() { return "Hi " . $this->name; } } // 古い方法 $human = new Human(“文字1"); echo $human->hello(); // 新しい方法 echo (new Human("文字1"))->hello(); Copyright © CA ADvance .inc 2012 19
  • 20.
    PHP5.4の新機能 ■ビルトインWebサーバ PHPだけでWebサービスを提供できる機能です。起動し たディレクトリが ドキュメントルートになります。 Apacheが持っているSSIなどの機能は使えず、飽くま でPHPを試すためのものです。 Copyright © CA ADvance .inc 2012 20
  • 21.
    PHP5.4の新機能 かなりたくさんありましたね。覚えるのが大変そうです・・・ 便利な機能も多いので、使いこなせるようになりたいですね! Copyright © CA ADvance .inc 2012 21
  • 22.
    PHP5.4の新機能 次はPHP5.3→5.4のバージョンアップについて見ていきましょう。 Copyright © CA ADvance .inc 2012 22
  • 23.
    PHP5.3→5.4のバージョンアップについて ■とりあえず移行ガイドを見てみる。 http://php.net/manual/ja/migration54.php PHP 5.4.x で改良された点のほどんどは、既存のコードに影響 を及ぼしません。 →おぉ、素晴らしい!! Copyright © CA ADvance .inc 2012 23
  • 24.
    PHP5.3→5.4のバージョンアップについて 移行ガイドを見てみると、下位互換性のない変更点がたくさんあ ります・・・ http://www.php.net/manual/ja/migration54.incompatible.php セーフモード をサポートしなくなりました。セーフモードでの動作を前提とするアプリケーションは、 セキュリティに関する調整が必要となります。 ■マジッククォート が削除されました。 この機能に依存するアプリケーションは、依存しないように修正しないとセキュリティの問題が発生します。 get_magic_quotes_gpc() と get_magic_quotes_runtime()は常に FALSE を返すようになりました。 set_magic_quotes_runtime() を実行すると E_CORE_ERROR が発生 します。 ■ini 設定 register_globals と register_long_arraysが削除されました。 ■呼び出し時の参照渡しをサポートしなくなりました。 ■breakと continueへの引数として、変数は使えなくなりました。つまり、 break 1 + foo() * $bar; などとは書けなくなったということです。 静的な引数を使う のはもちろん可能で、break 2; などは使えます。 この変更の副作用として、 break 0; や continue 0; が使えなくなりました。 ■Date 拡張モジュールにおいて、TZ 環境変数によるタイムゾーンの設定をサポートしなくなりました。 php.ini 設定 date.timezone あるいは date_default_timezone_set()関数でタイムゾーンを指定しなければなりません。 デフォルトのタイムゾーンが設定されていない場合に推測することがなくなり、 未 設定の場合は常に "UTC" とみなして E_WARNING を発生させるようになりました。 ■$a が文字列の場合に非数値のオフセット (たとえば $a['foo']) を指定したときの isset() の返り値は false、 そして empty() の返り値は true となりました。 そして同時に E_WARNING が発生します。オフセットに double や bool そして null を指定した場合は E_NOTICE が発生します。数値とみなせる文字列を渡した場合 ($a['2'] など) の挙動はこれまでと変わりません。 '12.3' や '5 foobar' のようなオフセットは非数値とみなされて E_WARNINGが発生しますが、過去との互換性の ためにそれぞれ 12 および 5 に変換されることに注意しましょう。 次のようなコードの返す値が変わります。 $str='abc';var_dump(isset($str['x'])); // PHP 5.4 以降では false、5.3 以前のバージョンでは true ■配列を文字列に変換しようとすると E_NOTICE が発生するようになりました。 キャストの結果は "Array" で、以前と変わりません。 ■NULL、FALSE あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのような E_STRICT エラーではなく warning が発生するよ うになりました。 ■スーパーグローバルをパラメータ名として使うと fatal error となります。つまり function foo($_GET, $_POST) {} などのコードは使えなくなります。 ■ハッシュアルゴリズム Salsa10 および Salsa20 が削除されました。 ■array_combine() のパラメータとして空の配列を二つ指定したときの返り値が FALSE ではなく array() となりました。 ■htmlentities() は、アジアの文字に対して使ったときに E_STRICT を発行するようになりました。この場合の htmlentities() の挙動が htmlspecialchars() (こ ちらは以前からそうなっていた) と同じになりました。 Copyright © CA ADvance .inc 2012 24
  • 25.
    PHP5.3→5.4のバージョンアップについて 特にやばそうなもの。 ■呼び出し時の参照渡しをサポートしなくなりました。 ■$a が文字列の場合に非数値のオフセット (たとえば $a['foo']) を指定したときの isset() の返り値は false、 そして empty() の返り値は true となりました。 そして同時に E_WARNING が発生します。 ■配列を文字列に変換しようとすると E_NOTICE が発生するようになりました。 キャストの結果は "Array" で、以前と変 わりません。 ■NULL、FALSE あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのような E_STRICT エラーではなく warning が発生するようになりました。 Copyright © CA ADvance .inc 2012 25
  • 26.
    PHP5.3→5.4のバージョンアップについて シーエーアドバンスでもPHP5.4に取り組もうとしました。 対象は、インターネット広告運用のプラットフォーム。 オレオレフレームワークです。 Copyright © CA ADvance .inc 2012 26
  • 27.
    PHP5.3→5.4のバージョンアップについて 広告運用プラットフォーム →オレオレフレームワーク。 参照渡しがたくさん→気合いで修正。 Depricatedがたくさん→とりあえず無視。 何とか動くようになったと思ったら・・・ Copyright © CA ADvance .inc 2012 27
  • 28.
    PHP5.3→5.4のバージョンアップについて 開発機(ローカルWindows)のmemcacheが動かない・・・ PHP5.4版のphp_memcache.dllをネットで探すも見つからず。 →バージョンアップは一旦断念。 残念!!!!! Copyright © CA ADvance .inc 2012 28
  • 29.
    総括 許されるなら、早くPHP5.4に切り替えた方が良いと思います。 ・大幅なメモリ使用量の削減 (43%削減されるというデータがあるそうです) ・実行速度のUP (あるテストでは、25%高速化されているという結果も) ・新機能を使うことによる、コード量の削減→見やすいコードに などなど、新しいものには素晴らしい部分がたくさんあります。 Copyright © CA ADvance .inc 2012 29
  • 30.