php5 4勉強会
TRANSCRIPT
Copyright © CyberAgent .inc 2011 1
PHP5.4 勉強会
株式会社シーエーアドバンス大谷 祐司
Copyright © CA ADvance .inc 2012 2
自己紹介
大谷 祐司(おおたに ゆうじ)--------------------------------------株式会社シーエー・アドバンス 技術責任者。技術大好き、プログラム大好きです。
山口県出身で、現在は東京在住。沖縄が大好きで毎月来ています。( ホテルとオフィスの往復がほとんどですが・・・ )
9 月で 32 歳になります。
Copyright © CA ADvance .inc 2012 3
自己紹介
参加者の皆さんにも自己紹介してもらいましょう。
Copyright © CA ADvance .inc 2012 4
自己紹介
シーエーアドバンスの社内勉強会を外部解放するというコンセプトで、今日の勉強会は企画されました。
弊社では、定期的に技術に関する勉強会を行っています。興味を持った方は、「エグジニアブログ」で検索してみてください。
Copyright © CA ADvance .inc 2012 5
自己紹介
初めての試みですが、失敗を恐れずに頑張ります!皆さんにとって有意義な勉強会になれば幸いです。
Copyright © CA ADvance .inc 2012 6
はじめに
■ 今日のテーマ
3 月に安定板がリリースされた PHP5.4 です。
Copyright © CA ADvance .inc 2012 7
今日の内容
以下についてお話しします。
■PHP5.4 の新機能
■PHP5.3→5.4 のバージョンアップについて
■ 弊社のバージョンアップ事例
Copyright © CA ADvance .inc 2012 8
今日の内容
PHP5.4 もう導入していますか?
Copyright © CA ADvance .inc 2012 9
PHP5.4 の新機能
PHP5.4 開発時に、 PHP6 にするか検討したらしいです。
それくらい大きく変わっていました・・・
Copyright © CA ADvance .inc 2012 10
PHP5.4 の新機能
新機能がたくさん・・・■ 配列をメソッドチェーンのように参照可能
■callable 配列をそのまま実行可能
■ クロージャの中で $this が使える
■Traits のサポート
■ 配列のシンタックスシュガー
■static メソッドの可変呼び出し
■callable が型ヒントに使える
■ コンストラクタからメソッドチェーンが実行可能
■ ビルトイン WEB サーバ
今日はこれらを、詳しく解説します。
Copyright © CA ADvance .inc 2012 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 12
PHP5.4 の新機能
■ callable 配列をそのまま実行可能
callable 配列( array(‘class’, ‘method’) )をそのまま実行出来るようになりました。
$f = array('Foo','bar');echo $f('TEST');
Copyright © CA ADvance .inc 2012 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 14
PHP5.4 の新機能
■Trait のサポート
・ Trait とは、クラスの継承関係に影響を与えずクラスに適用できるメソッドとプロパティの集合です。
・ trait 本体は、 class XXX のように trait XXX と作成します。呼び出す際は、クラス内で use XXX と宣言します。
Copyright © CA ADvance .inc 2012 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 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 17
PHP5.4 の新機能
■ static メソッドの可変呼び出し
波括弧を使い static メソッドの呼び出しを可変に出来ます。
class StaticClass { public static function getName() { return ‘ 名前 '; }}$method = 'getName';echo StaticClass::{$method}(); // 「名前」と表示される。
Copyright © CA ADvance .inc 2012 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 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 20
PHP5.4 の新機能
■ ビルトイン Web サーバ
PHP だけで Web サービスを提供できる機能です。起動したディレクトリが ドキュメントルートになります。 Apache が持っている SSI などの機能は使えず、飽くまで PHP を試すためのものです。
Copyright © CA ADvance .inc 2012 21
PHP5.4 の新機能
かなりたくさんありましたね。覚えるのが大変そうです・・・
便利な機能も多いので、使いこなせるようになりたいですね!
Copyright © CA ADvance .inc 2012 22
PHP5.4 の新機能
次は PHP5.3→5.4 のバージョンアップについて見ていきましょう。
Copyright © CA ADvance .inc 2012 23
PHP5.3→5.4 のバージョンアップについて
■ とりあえず移行ガイドを見てみる。http://php.net/manual/ja/migration54.php
PHP 5.4.x で改良された点のほどんどは、既存のコードに影響を及ぼしません。
→おぉ、素晴らしい!!
Copyright © CA ADvance .inc 2012 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 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 26
PHP5.3→5.4 のバージョンアップについて
シーエーアドバンスでも PHP5.4 に取り組もうとしました。
対象は、インターネット広告運用のプラットフォーム。オレオレフレームワークです。
Copyright © CA ADvance .inc 2012 27
PHP5.3→5.4 のバージョンアップについて
広告運用プラットフォーム→オレオレフレームワーク。
参照渡しがたくさん→気合いで修正。Depricated がたくさん→とりあえず無視。
何とか動くようになったと思ったら・・・
Copyright © CA ADvance .inc 2012 28
PHP5.3→5.4 のバージョンアップについて
開発機 ( ローカル Windows) の memcache が動かない・・・PHP5.4版の php_memcache.dll をネットで探すも見つからず。
→バージョンアップは一旦断念。 残念!!!!!
Copyright © CA ADvance .inc 2012 29
総括
許されるなら、早く PHP5.4 に切り替えた方が良いと思います。
・大幅なメモリ使用量の削減(43%削減されるというデータがあるそうです )
・実行速度の UP( あるテストでは、 25%高速化されているという結果も )
・新機能を使うことによる、コード量の削減→見やすいコードに
などなど、新しいものには素晴らしい部分がたくさんあります。
Copyright © CA ADvance .inc 2012 30
ご清聴ありがとうございました。