RubyとPHP(仮) 基本的な違い(2)
2008年05月02日(金)17:17|天方
rubyとphpの基本的な違いの第二弾です。
変数とデータ型(2)
クラスとデータ型
rubyとphpのデータ型の考え方は大きく違います。 どのように比較するのか頭を悩ませる項目です。
rubyでは、データ型はすべてクラスです。 一方、PHPでは、integerやstring、arrayなどのよくつかわれるデータ型は専用に用意され、 クラスは、それらと同一階層に存在しています。
今回は、PHPのデータ型とそれに対応するRubyのクラスを一覧化してみました。
| Ruby(クラス) | PHP(データ型) | |
|---|---|---|
| ブーリアン | TrueClass か FalseClass | boolean |
| 整数 | Integer(場合によっては、Bignum か Fixnum) | integer |
| 浮動小数点 | Float | float、double、real |
| 文字列 | String | string |
| 配列 | Array | array |
| オブジェクト | Object(全てのクラスはObjectを親クラスとしている) | object |
| リソース | - | resource |
| NULL | - | NULL |
rubyもphpもそれぞれ特徴があります。PHPで一番大きな特徴というとNULLには専用の型があるということです。 NULL型の唯一の値はNULLです。変数がNULL型かどうかをチェックするには、is_null($var)関数を使います。 PHPではNULLを使って比較する場合には気をつける必要があることは有名です。
たとえば、NULL == 0 はTRUEを返します。これは == で比較する場合にNULL型はinteger型に変換され、0なってしまうからです。 PHPで NULLと0を違うように判定するためには、 NULL === 0 と記述する必要があります。 実は’NULL’も==で比較するとTRUEを返します。PHPで正しいコードを書くためには、この暗黙の型変換の知識を持っている必要があります。
ここで、クラスとデータ型について比較したので、整数や浮動小数点の値の範囲についても比較しておきましょう。
| Ruby | PHP | |
|---|---|---|
| Fixnum,Bignum .vs. integer | Fixnum:プラットフォーム依存Bignum:制限なし(一般的にはFixnumは-2^30~2^30-1 または -2^62~2^62-1) | integer:プラットフォーム依存(一般的には-2^31~2^31 または -2^63~2^63-1) |
| Float .vs. float,double,real | rubyをプラットフォーム依存(一般的には64ビットIEEEフォーマットが採用される) | float,double,real:プラットフォーム依存(一般的には64ビットIEEEフォーマットが採用される) |
今回非常に驚いたのは、二つの言語とも、整数がプラットフォーム依存で定義されていることです。 (浮動小数点はしょうがないでしょうけれど) ただ、この二つの言語では、その意味が大きく違います。Rubyでは、Fixnumの範囲を超える値は自動的にBignumに変換されるため、プラットフォームが変わっても、パフォーマンス以外には問題がおこりません。しかし、PHPでは、環境によっては桁が足りないなどの問題が発生する可能性があります。
PHPのターゲットとして、これが問題になることは少ないかもしれません。しかし、気をつけなければならない点ではあるでしょう。逆にRubyを使っている場合には、ハードウェアの性能を引き出しつつポータブルなプログラムが書けるという特典が得られることを意味しています。
今回は以上です。
次回は、RubyでなぜTrueClass/FalseClassがあるのか?について迫ってみたいと思います。