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

Preview:

DESCRIPTION

Summary of recent activity in the PHP community, new feature of PHP 5.3, 5.4 and 5.5. This presentation is written by Japanese.

Citation preview

PHPPHPの今とこれから の今とこれから 20122012

日本PHPユーザ会 廣川 類

PHPカンファレンス2012

2012年9月15日(土)

ポスト5.3時代のコード

マイクロフレームワークSlimの例

モジュラーデザイン:名前空間、オートローダー

<?phprequire 'vendor/autoload.php';

$app = new \Slim\Slim();$app->get('/hello/:name', function ($name) use ($app) { $app->render('tpl1.php', array('name'=> $name));});$app->run();

[tpl1.php]Hello, <?= $name; ?>

[tpl1.php]Hello, <?= $name; ?>

Hello, taroHello, tarohttp://www.example.com/hello/tarohttp://www.example.com/hello/taro

ComposedComposed

無名関数無名関数

名前空間名前空間

PHP アンケート 2012

主に使っているPHPのバージョン1) PHP 4.x 2) PHP 5.0-5.1 3) PHP 5.2 4) PHP 5.35) PHP 5.4 6) 使ってない

PHPユーザ分布

引用: W3Techs.com, 2012/9/8版

77.9%

21.2%

4.0%1.2%0.9%0.6%0.2%

usage of server-side programming language (2012/9/8)

PHPASP.NETJavaColdFusionPerlRuby

54.3%

8.9%

7.0%

3.7%

3.3%

22.8%

Market Share of CMS

WordPressJoomlaDrupalvBulletinBloggerother

PHPユーザ分布

引用: W3Techs.com, 2012/9/8版

95.7%

4.3%

Version of PHP (2012/9/8, W3Techs.com)

PHP 5PHP 4

4.1%

58.6%

36.5%

0.7%

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

5.1

5.2

5.3

5.4

バージョンを更新する/しない理由

・新機能/性能が魅力的

・セキュリティ/バグ修正

・サポート切れ

・新機能/性能が魅力的

・セキュリティ/バグ修正

・サポート切れ

・更新/確認の手間

・新機能/性能の魅力小

・周辺環境の更新が追いつかない

・更新/確認の手間

・新機能/性能の魅力小

・周辺環境の更新が追いつかない

更新する理由 更新しない理由

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

PHPの歩み

・自動グローバル変数のデフォルト無効化・mbregex・zend-multibyte

2003 2004 2005 2006 2007 2008 2009

4.3・CLI・stream

4.4`02/12 `05/6

・バグ修正`08/8 (EOL)

2010

5.3`09/6

・名前空間・クロージャ・遅延静的束縛・GC改善・MySQLnd

5.5

PHP10周年

JPUG10周年

フレームワークAJAX

XMLW/S API

Web/DBセキュリティ

2011 2012PHPcon関西

PHPcon北海道

5.4・Traits- 速度改善- MB対応標準化- 組込みWebサーバ- レガシー機能削除

`12/36.0`10/3 キャンセル

・Unicode

・エンジン/OOP大幅強化:ZE2・XML対応強化(SimpleXML)・Webサービス(SOAP)・DB強化 (SQLite, MySQLi)

`10/12 (EOL)

5.0`04/7

5.1`05/11 5.2

`06/11

・メモリ/速度改善・入力フィルタ・速度改善

・PDO

スマフォ

開発のソーシャルコーディング対応

 2012/3 ソースコードの管理をsubversionからgitへ移行

 git.php.net → githubにミラー

RFC作成

投票

新機能

議論/更新

http://wiki.php.net/rfc

バグトラッカで検索

http://bugs.php.net

バグ修正

登録(チケット取得)

#12345

PHPソースをクローン

実装+テストコード作成

pullリクエスト発行

リクエスト受理/拒否

http://github.com/php/php-src

議論/更新

フレームワークと相互運用性

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

ZF 2Symfony2FuelPHP 1.2

相互運用性interoperability

フレームワークA ORMクラスC

ViewクラスD

独自クラスE

フレームワークB

ViewクラスF

独自クラスE

ORMクラスCモジュラー

PHP-FIG と PSR

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 : コーディングスタイルガイド

http://www.php-fig.org/

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

効率的で柔軟な運用が可能に

PSR準拠とするには?

2.PHP_CodeSnifferで確認

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

$ 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

$ wget http://cs.sensiolabs.org/get/php-cs-fixer.phar

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

依存性マネージャ:Composer

パッケージマネージャ → dependency manager プロジェクト単位で複数/階層的な依存関係を解決

主要フレームワークに対応 : Symfony2, ZF, FuelPHP, ...

$ php composer.phar install

{ "require": { "twig/twig": "1.6.*", "slim/slim": "1.6.*", }}

composer.jsonの例

(デフォルト:バージョンをロック)

$ php composer.phar update

composer.jsonに依存性を記述composer.jsonに依存性を記述

パッケージのインストールパッケージのインストール

依存性を更新依存性を更新

オートローダとロックファイル(composer.lock)自動生成

PackagistPackagist::ComposerComposerによる配布による配布

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でより速く、快適に

大幅に高速化、省メモリ化

Athlon II X4 640 3.0GHz, Ubuntu 12.04

PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50

1

2

3

4

5

6Zend/bench.php strcat(200000)

sieve(30)nestedloop(12)matrix(20)heapsort(20000)hash2(500)hash1(50000)fibo(30)ary3(2000)ary2(50000)ary(50000)ackermann(7)mandel2mandelsimpleudcallsimpleucallsimplecallsimple

実行

時間

[s]

PHP 5.4でより速く、快適に

大幅に高速化、省メモリ化

Athlon II X4 640 3.0GHz, Ubuntu 12.04PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50

5

10

15

20

25

30

35

40Zend/micro_bench.php $x = $f ? $f : tmp

$x = $f ? $f : $a

$x = $f ?: tmp

$x = $a ?: null

$x = $str[0]

$x = $hash['v']

$x = $GLOBALS['v']

$x = $_GET

$x = TEST

new Foo()

$x = Foo::TEST

$this->f()

empty($this->x)

isset($this->x)

$this->x--

$this->x++

--$this->x

++$this->x

$this->x += 2

$this->x = 0

$x = $this->x

Foo::f()

self::f()

empty(Foo::$x)

isset(Foo::$x)

Foo::$x = 0

$x = Foo::$x

empty(self::$x)

isset(self::$x)

self::$x = 0

$x = self::$x

int_func()

undef_func()

func()

empty_loop

実行

時間

[s]

PHP 5.4 でコード再利用:Trait

Trait: 単一継承の言語でコードを再利用する仕組み

実装の再利用( ≠ interface:実装を強制)

クラスや他のTraitとのメソッド名衝突を解決する仕組みが必要<?php trait A { public function show() {

echo 'Hello,',$this->getName(),'!'; } abstract public function getName(); }

class Base { /* 1 */ }

class Foo extends Base {use A;public function getName() { echo 'PHP'; }

}$obj = new Foo();echo $obj->show(); // Hello,PHP!

<?php trait A { public function show() { echo 'Hello,';} } trait B { public function show() {echo 'PHP!';} }

class Foo { use A, B { A::show insteadof B; B::show as showN; }}

$obj = new Foo();echo $obj->show() . $obj->showN();

リネームではなくエイリアス

PHP 5.4 で日本語の扱いが便利に

Zendエンジンマルチバイト対応標準化:バイナリ互換性改善

デフォルト文字コードがISO-8859-1からUTF-8に: default_charset, htmlspecialchars(), etc.

mbstring文字コード追加: 携帯絵文字(Unicode 6), etc.

◇ PHP構築時: --enable-zend-multibyte --enable-mbstring ◇ mbstring.script_encoding でスクリプト文字コード指定

PHP <= 5.3

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

PHP 5.4

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

正規表現置換eオプション:セキュリティホールとなりやすい

mb_ereg_replace_callback()関数追加  → 置換文字列で コールバック関数を使用可能に

PCREにおけるpreg_replace_callback()に相当

PHP 5.4.1:コールバック関数による置換

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

PHP 5.5

リリース時期: 未定 (2013/3 ?)

PHP 5.3、5.4と比べて小幅な改訂となる可能性がある

目玉機能は、(今のところ) Generator

Generator

Generator:イテレータを関数で定義(Python) 例:ファイルの各行を処理: ファイル全体読込み→メモリが大量に必要

イタレータ定義:多くのコード記述が必要

配列全体を返すのではなく、値を生成するイタレータを返す

<?phpfunction xrange($start, $end, $step = 1) { for ($i = $start; $i < $end; $i += $step) { yield $i; }}

foreach (xrange(10, 20) as $i) { echo $i;}

(https://wiki.php.net/rfc/generators)

Nikita Popov17歳、ベルリン

10,11,....,20

finallyキーワード

(https://wiki.php.net/rfc/finally)

try { echo ”1"; throw new Exception("ex");} catch (Exception $e) { echo ”2";} finally { echo "#";}

finallyブロック:tryブロックから出る際に常に実行される

例外発生の有無によらない → クリンナップコードを記述

return等でクリンナップコードがバイパスされることを防止

12#

$hash = password_hash($password, PASSWORD_BCRYPT);

パスワード用ハッシュ

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

$key = hash_pbkdf2("sha512", $password, $salt, 5000, 16, true);$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,

   $key, $data, MCRYPT_MODE_CBC, $iv);

PBKDF2: パスワードハッシュ用キーストレッチ

scrypt に基づく実装も提案されている

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

crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった

function randomHexString($length) { for ($i = 0, $s = ''; $i < $length; ++$i) { $s .= "0123456789abcdef"[mt_rand(0, 15)]; } return $s;}echo randomHexString(10); 

その他の機能(1)

(https://wiki.php.net/rfc/constdereference)

echo ”123”[1]; echo [1,2,3][2];

ランダムな16進文字列を生成する例

配列/文字列定数の添字参照

foreach ($users as $user) { list($id, $name) = $user; echo “$id => $name”;}

foreach ($users as list($id, $name)) { echo “$id => $name”;}

foreachでリスト代入が可能に (https://wiki.php.net/rfc/foreachlist)

1e1384a471

2

3

PHPの成功と未来

学習が容易: 言語がシンプル、ドキュメントが豊富 - 多様な要求に応えつつ、わかり易さを保つことが必要

- 地道な活動が重要: ローカルなPHPカンファレンス、勉強会、等

進化を継続: Webの進化に対応し、必要十分な解を提供

- 開発者/貢献者の育成

- キラーアプリ(WordPressなど)の存在がキー

PHPは歯ブラシのようなもの。いつも使う役に立つシンプルなツールだけど、誰も歯ブラシのことなんて気にしないよね。PHPは「問題を解くためのシンプルなツール」なのさ。

(http://en.wikiquote.org/wiki/Rasmus_Lerdorf)Rasmus語録

PHPユーザ相互の情報交換およびコミュニティの健全な発展

設立趣旨

• 高性能Webミドルウエアへのニーズ増大• オープンソースソフトウエアの発展

背景

国内PHPユーザの増加

活動内容

ドキュメント整備

セミナー/イベント

メンバー/スタッフ国際化

http://www.php.gr.jp/Web

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

日本PHPユーザ会

(2000年4月発足)

php-users, php-dev, php-doc, phpug-admin

メーリングリスト

Recommended