PHPを愛する試み
僕はRubyが好きだ。プライベートではRubyばっかり使っている。でも、仕事ではPHPを使わなければならない。これまでPHPは書きにくいーと思い込んでいてあまり好きではなかったのだけど、仕事で使う以上PHPを好きになった方がきっと幸せになれる。何かを好きになるにはどうすればよいか。そう、相手のことを知る努力をすればいいんだ!ということで、PHPについて知る努力をしてみた。
これは...
PHP好きになれるかも!
普段Rubyで書いてるコードをPHPで書いてみる
折角なので自分が普段Rubyを使っていて便利だなーと感じていることをPHPではどう書くのか(厳密では無いにしても大体同じ内容はどう書くか)試してみた。Rubyは1.9.2、PHPは5.3.10。
多重代入っぽいもの
a, b = [1, 2] puts a puts b
<?php list($a, $b) = array(1, 2); echo "$a\n"; echo "$b\n";
ほう!
可変長引数
def foo(*args) p args end foo 1, 2 foo 1, 2, 3
<?php function foo() { var_dump(func_get_args()); } foo(1, 2); foo(1, 2, 3);
ほほう!
無名関数・クロージャ
a = [1, 2, 3] b = 10 r = a.map {|v| v * b} p r
<?php $a = array(1, 2, 3); $b = 10; $r = array_map(function($v) use ($b) {return $v * $b;}, $a); var_dump($r);
名前空間
module A class C def self.foo; puts 'A_foo'; end end end module B class C def self.foo; puts 'B_foo'; end end end A::C.foo B::C.foo
<?php namespace A{ class C { static function foo() {echo "A_foo\n";} } } namespace B{ class C { static function foo() {echo "B_foo\n";} } } namespace { \A\C::foo(); \B\C::foo(); }
キモい!けど、きっと慣れる!
呼び出し元を一覧表示
def foo1; foo2; end def foo2; foo3; end def foo3; puts caller; end foo1
<?php function foo1() {foo2();} function foo2() {foo3();} function foo3() {debug_print_backtrace();} foo1();
これできるんだ!
オブジェクトの情報をいろいろ表示
class C; def foo1; end end class CC < C; def foo2; end end class CCC < CC; def foo3; end end ccc = CCC.new puts ccc.class.ancestors puts ccc.methods
<?php class C { function foo1() {} } class CC extends C { function foo2() {} } class CCC extends CC { function foo3() {} } $ccc = new CCC(); var_dump(get_class($ccc)); var_dump(class_parents($ccc)); var_dump(get_class_methods($ccc)); //さらにReflectionObject::exportを使うと、メソッドの定義場所やインスタンス変数まで表示してくれる ReflectionObject::export($ccc);
ソースコード読むとき助かる!
メソッドチェイン
class C def foo1; self; end def foo2; self; end def foo3; puts 'done'; end end C.new.foo1.foo2.foo3
<?php class C { function foo1() {return $this;} function foo2() {return $this;} function foo3() {echo 'done';} } $c = new C(); $c->foo1()->foo2()->foo3();
流れてる...
メタプログラミング(動的な関数定義と呼び出し)
class C def method_missing(method_name, *args) puts method_name end end c = C.new [:foo1, :foo2].each {|m| c.__send__(m)}
<?php class C { function __call($method_name, $args) { echo "$method_name\n"; } } $c = new C(); foreach(array("foo1", "foo2") as $m) {$c->$m();}
こいつ・・・動くぞ!
さらにPHP5.4にすると
スゴイらしい...
http://php.net/manual/ja/migration54.new-features.php
配列のリテラルとして[]が使えたり、ビルトインサーバが使えたりするらしいですお...
PHP
好きになれるかも!今度はフレームワークとかも触ってみよう!
※シリーズもので頑張ってる
PHPを愛する試み
PHPを愛する試み 〜調教編〜
PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜