PHPを愛する試み

僕はRubyが好きだ。プライベートではRubyばっかり使っている。でも、仕事ではPHPを使わなければならない。これまでPHPは書きにくいーと思い込んでいてあまり好きではなかったのだけど、仕事で使う以上PHPを好きになった方がきっと幸せになれる。何かを好きになるにはどうすればよいか。そう、相手のことを知る努力をすればいいんだ!ということで、PHPについて知る努力をしてみた。

PHP The Right Wayを読む

http://ja.phptherightway.com/

PHPへの愛が100上がった☆

これは...

PHP好きになれるかも!

普段Rubyで書いてるコードをPHPで書いてみる

折角なので自分が普段Rubyを使っていて便利だなーと感じていることをPHPではどう書くのか(厳密では無いにしても大体同じ内容はどう書くか)試してみた。Rubyは1.9.2、PHPは5.3.10。

多重代入っぽいもの

Ruby

a, b = [1, 2]
puts a
puts b

PHP

<?php
list($a, $b) = array(1, 2);
echo "$a\n";
echo "$b\n"; 

ほう!

可変長引数

Ruby

def foo(*args)                                                                                                                                 
  p args
end

foo 1, 2
foo 1, 2, 3

PHP

<?php
function foo() {
  var_dump(func_get_args());
}

foo(1, 2);                                                                                                                                
foo(1, 2, 3);

ほほう!

無名関数・クロージャ

Ruby

a = [1, 2, 3]
b = 10
r = a.map {|v| v * b}
p r

PHP

<?php                                                                                                                                     
$a = array(1, 2, 3);
$b = 10;
$r = array_map(function($v) use ($b) {return $v * $b;}, $a);
var_dump($r);

キモカワイイ

名前空間

Ruby

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

<?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();
}

キモい!けど、きっと慣れる!

呼び出し元を一覧表示

Ruby

def foo1; foo2; end
def foo2; foo3; end
def foo3; puts caller; end
foo1

PHP

<?php
function foo1() {foo2();}
function foo2() {foo3();}
function foo3() {debug_print_backtrace();}
foo1();

これできるんだ!

オブジェクトの情報をいろいろ表示

Ruby

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

<?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);

ソースコード読むとき助かる!

メソッドチェイン

Ruby

class C                                                                                                                                                                             
  def foo1; self; end
  def foo2; self; end
  def foo3; puts 'done'; end
end

C.new.foo1.foo2.foo3

PHP

<?php
class C
{
  function foo1() {return $this;}
  function foo2() {return $this;}
  function foo3() {echo 'done';}
}

$c = new C();                                                                                                                                                                       
$c->foo1()->foo2()->foo3();

流れてる...

メタプログラミング(動的な関数定義と呼び出し)

Ruby

class C                                                                                                                                   
  def method_missing(method_name, *args)
    puts method_name
  end
end

c = C.new
[:foo1, :foo2].each {|m| c.__send__(m)}

PHP

<?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:: および遅延静的束縛〜