徹底攻略!php5.4
TRANSCRIPT
LOCAL PHP部参加者募集中
•特に喋ってくれる人募集中!
•むしろ来年のOSCは代わりに喋るぜ!ってくらいで!
•来年のPHPカンファレンス北海道でも喋って!(あれば)
•詳細は「LOCAL PHP部」で検索!
12年6月16日土曜日
LOCAL PHP部• 隔月でPHPの勉強会を開催
• 次回は8月を予定
• 参加自体は誰でも可能
• 部員になる必要はない
• 誰でもイベントを主催できます
• このセッションもLOCAL PHP部 勉強会の一環
12年6月16日土曜日
勉強会に参加するとこんなにいいことが!• PHP仲間と知り合える
• 実務ではなかなか導入できない技術情報を知ることができる
• 肉が食える(かもしれない)
• PHP部で就職が決まりました!(結構ある)
• PHP部で結婚できました!(関係ない)
12年6月16日土曜日
あの国民的アイドルグループの派生グループのメンバーも、COBOL検定一級を持っていると
言いますが、PHPについては触れられていません。(C)CCBYSA 2010 OpenStreetMap.org contributors
12年6月16日土曜日
http://news.mynavi.jp/news/2012/06/14/146/index.html
統計調査でも、PHPの人気は下落傾向にあると言われています。
12年6月16日土曜日
namespace• これまで名前空間がないために長いクラス名
になっていたPHP界に革命
• 先進的フレームワークもこぞって採用(Symfony2、FuelPHPなど)
• クラス名の管理が簡潔になった
• 過去の資産を使う場合は有効活用できないという難点
12年6月16日土曜日
無名関数• usortの引数をものすごく書きやすくなったという革命
• 元々$hoge();($hogeは文字列)で関数を呼べるので、使い所が難しい
• PHP5.4からtype hintingで指定できるようになったので、型の厳格化の一環としては便利になる
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日土曜日
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日土曜日
これにより、平成時代にPHPが嫌われていた原因の一つである、「PHPは配列やハッシュを書くのにarray()とか毎回書くのだ
りーんだよpgr」という批判に対抗することができ
るようになりました。
12年6月16日土曜日
トレイト• クラスの継承の制約を解消するための仕組み
• 特定のクラスに対し、継承関係を無視してメソッド、プロパティを追加できる
• 様々なクラスで使うメソッドなどを、継承関係を無視して追加することができるので、継承関係が簡潔になる
12年6月16日土曜日
<?phptrait 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日土曜日
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日土曜日
<?=の常時有効化• 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日土曜日
breakの引数に変数の禁止
• break $var; ←これが駄目
• break 1; ←これは可
•数字を指定すると、数字分のネストを抜けることができる機能(知ってた?)
• continueも
12年6月16日土曜日
htmlspecialcharsの引数に指定できる定数追加
• ENT_SUBSTITUTE / ENT_DISALLOWED / ENT_HTML401 / ENT_XML1 / ENT_XHTML / ENT_HTML5
• ENT_HTML5を指定しておくといいかも
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日土曜日
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 = new mysqli( 'localhost', 'root', '', 'test');
foreach( $mysqli->query( 'SELECT * FROM hoge' ) as $result) { var_dump($result);}
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日土曜日
PHP5.4.3CGIモード関係の脆弱性• 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日土曜日