#はじめに
この記事は、PHPという言語について、Javaと比較しながら学んでやろう…という方針のもとで書かれています。ですのでJavaの知識はあるけれど、「PHPってなに??」な人(主に筆者)向けのものとなっています。ちなみに筆者は、Java学習期間→約3ヵ月、PHP学習期間→約2週間というThe☆初心者なので、内容に関しての間違いがあるかもしれませんが一切責任を負いません!…ですがコメントなどで指摘していただけると嬉しいです。あくまで学習の記録としてなにかのご参考になればと思います。
#JavaとPHPの決定的な違い
まずは両言語の大きな違いについて…
まあ普通に考えれば、そもそも別々の言語なので「すべてが違う」といわれると何も返す言葉(知識)がございません。なのでここではとりあえずそれはおいておきまして…JavaとPHPの大きな違いは、「コンパイラ言語」か「スクリプト言語」か、ということです。
…コンパイラ?スクリプト?何やら難しい横文字が出てきてわかりにくいですが、端的に説明すると以下の通りです。
・Java → コンパイラ言語
プログラムを実行する際、一旦コンピュータが読み取れるように変換(コンパイル)される。最初に変換を済ませているので動作が早い。
・PHP → スクリプト言語
プログラムを実行する際、逐一コンピュータの言語に変換されながら実行される。その都度変換をするので動作は遅いが、ソースコードの反映は早い。
つまり、あるプログラムを動かす際に、そのすべてを一旦コンピュータが使用する言葉に変換するかどうかの違いです。例えば、あるプログラムを使う使用者の立場に立つならば、逐一変換するよりも、最初に一回だけ変換してあったほうが、変換の余計な手間が省けます。一方で、あるプログラムの開発者の立場に立つならば、変更したところだけを実行したいときには、その部分だけを変換すればよいので、全部を変換するコンパイラ言語よりも、逐一変換してくれるスクリプト言語のほうが、結果の反映が早くなり、便利になります。
このように、JavaとPHPにはコンピュータ語への変換という点で、大きく異なった特性を持ちます。筆者がPHPを勉強して間もないとき、ソースを修正すれば、ブラウザの更新ボタンをクリックするだけで結果が反映されるPHPに感動したものです。Javaではいちいちサーバーを再起動させてうんぬんかんぬんしていましたので、ためしためし動作を確認しながら学習する身にとっては、PHPはらくちんです。
#変数について
ここから、本題です。変数について、JavaとPHPの大きな違いは以下のことが言えます。
・Java → 変数の「型」が必要 (ex. String hoge = "やまだ")
・PHP → 変数の「型」が不要 変数の頭に$を付けるだけ (ex. $hoge = "やまだ")
変数宣言するときに、Javaでは決まった「型」を宣言しなければなりません。一方でPHPでは変数名の頭に「$」を付けるだけで変数が作れてしまいます。JavaではStringやintなど、決まった「型」が存在し、String(文字列)型の変数に数値なんて入れようものなら、エラーというお叱りを受けてしまいます…しかし、PHPは変数の型を最初に決めておくなんてルールはないため、一つの変数に文字でも数値でもなんでも入れることができます。変数に関しては、Javaはルールがお堅く、PHPはルールが緩いって感じですね。
ただし、PHPは変数の型がないことから、どんなものでも入れ放題なのですが、筆者のような初心者は、そのような考えは要注意です。ポイントは、PHPでは変数の型がないというより、変数の型をPHPが気をきかせて勝手に変換してくれる、という点です。例えば次のような例文があるとします。
<?php
$hoge = "a";
$fuga = 0;
if ($hoge == $fuga){
//上の条件式はtrue判定される
}
なんと!このif文の条件式では、PHPは変数hogeと変数fugaを同等であると認識してしまうのです。a=0なんて、普通に考えて同じなわけないですよね。この現象はどうして発生するのでしょうか。実はPHPでは文字と数値を比較しようとすると、気をきかせて文字を数値に変換しようとします。しかも、文字の一番最初の単語に有効な数字がない場合、その文字を0として認識してしまうようです。なので上のソースでは、文字「a」を数字に変換しようとして、文字の中に有効な数字もないので、勝手に「0」としてしまったのです。以上のようなPHP気を利かせすぎて空回り問題はif文に限らず多くの箇所で発生するようです。このため、特にあまりプログラミングの経験がない人は、変数の型を常に意識することを心掛けたほうがよいでしょう。(自戒)
#まとめ
・Java → 変数に型が必要。ルールが厳しい!めんどくさいけどミスが少なくなる。
・PHP → 頭に$を付ければ、変数の型を勝手に判断してくれる。気はきくけど、融通が利かない!初心者は要注意。
今回は以上です。
#次回予告!!
未定!!多分!配列!!など!
ご覧いただきありがとうございました。
#補足(Javaの自動型変換機能について)
Javaにも型を自動で変換してくれる機能があったことを忘れておりました…なので、ここで少し詳細を
Javaでは以下のような書き方が可能です。
//数値同士の演算時の型変換
double hoge = 2.5 * 5;
//String型とint型を結合できる
String fuga = "windows" + 10;
//double型の変数にint型の数値を代入できる
double boee = 10;
3つの例を順に見ていきましょう
一番上の例は、double型の変数hogeの中で計算が行われる場合、その数値はdouble型になる、という例です。数値を扱う型には、intだけではなく、小数を扱うdoubleやfloat、intよりも大きな数字を格納できるlong、逆にintよりも小さい値が格納できるshortやbyteがあります。このような数値同士の計算を行う場合、Javaは気をきかせて型をどちらかの型に変換してから計算してくれます。例でいえば、計算する前に5→5.0としてから計算してくれます。
真ん中の例は、String型と数値を文字連結する場合、数値をString型に変換してから結合されます。文字連結といっても文字と文字(変換前は数値)を足すだけなので、ある意味上の例と同じく、演算時の自動型変換の一例といえるでしょう。
一番下の例は、ある型の変数に違う型の変数を代入できるという例です。これは先にものべた数値を扱う型に関する自動変換になります。この例では小数を含む数値の型であるdoubleに、整数の数値型であるintを代入しています。これをsysoutすると「10.0」になるのですが、なんとなく察しのつく方もいるかと思います。10を10.0と表現することは可能です。なのでJavaは「int型だけどまあdoubleに変換すればいいか…」と自動で型を変換してくれるのです。逆にint型の変数にdouble型の数値は代入できません。確かに10.0は10と表現できます。しかし、もし代入する値が2.5だとしたら、2.5は整数の型であるint型では表現できなくなってしまいます。つまり、整数は小数を含む数値で表現できるますが、小数を含む数値は整数のみでは表現できないので、このようなルールになっているのです。とある参考書ではこのように表現しています。
意味的に「小さな型」の値を「大きな型」の箱に代入する場合、代入される値が代入先の変数の型に自動的に変換されてから代入が行われる。(中山・国本 2014 p.78)
詳しくは「Java 代入時の自動型変換」などでお調べください。
以上のように、Javaでも自動で型変換をしてくれる場合があります。理解することは山積みですね…
参考文献
中山清喬・国本大悟 (2014)『スッキリわかるJava入門』株式会社インプレス
#おまけ
某ファンタジー映画より
double harry = 9 + 0.75;
String potter = harry + "番線";
ー感想などー
なんとなく思いついたのでやってみた