JavaとJavaScript(ちょっと)しか知らない私が、お仕事でPHPを触ることになり、その前に勉強がてらオレオレフレームワークを作ってみました。そのときにえっ!と驚いたことや、嵌ったことなどをざっくばらんに描いていきます。
念のため断っておくと、この記事にはJava界隈にいる私がPHPを触ってみて思ったことを素直に書くだけで、PHPが悪いとか、Javaは優れてるか、そいういうことを主張する意図は一切ありません。
文字列の連結は.
(ドット)
Javaではインスタンス.メンバ()
のように.
でオブジェクトのメンバにアクセスします。
対して、PHPでの.
は文字列の連結を行う演算子です。ついついobjcet.doSomething()
って書いちゃってなんで動かないのよと悩むこと多々・・・
関数のオーバーロードできない
これはまぁPHPに限った話ではありませんが、関数はオーバーロードできません。デフォルト引数があるからうまく使いましょう。
親クラスのコンストラクタは明示的に呼ばれない
これ、一番衝撃的だったかもしれない。Javaの世界じゃ親クラスあっての子クラスなので、親クラスが正しく初期化されないと子クラスが存在できません。親が初期化されない状態で子インスタンスが存在できるというのは衝撃的でした。
失敗を表す戻り値false
PHPでは処理の失敗を表す戻り値としてfalseがしばしば用いられます。正常終了なら文字列を返すのに失敗するとfalseを返すなんて、Javaの感覚で聞くと心臓がハカハカしてしまいますが、そういうもんなんですね。
配列は値渡し
Javaでは配列を引数に渡すとそれは参照渡しになります。渡した先で配列を呼び元の配列に影響します。
しかし、PHPの標準では値渡しなので呼び元の値には影響をあたえいません。function callFunc(&$array)
のように関数定義時に引数の前に&をつければ参照渡しになります。値渡しだとなんとなく性能のネックになりそうな気がするけど、あまり気にしなくていいのかなぁ→あまり気にしなくていいらしいです(コメント参照)
byte型がない
phpでバイト処理を行うときは文字列型の変数を使います。packやunpackと言った関数を駆使してバイナリの海を泳ぐようです。なれないとなかなか難しいです。
文字列の内部エンコーディング
文字列周りなので次はこちら。Javaの文字列は中身はUTF-16で持っているので単純ですが、PHPの内部エンコーディングは実行環境によって異なるようです。その辺意識してコードを書かないと、すぐに文字化け地獄。
private static final 相当がない
PHPには定数を表す方法がいくつかある。defineやconst。でもこれ、どっちにしてもpublicスコープになっちゃうのよね。クラスの中だけに閉じた定数って作れないんだねー。→新しいPHPだと作れるそうです(コメント参照)
noticeはcatchできない
しばしば目にするNotice hogehoge
。これ、裏側で例外が投げられていてそれをキャッチすれば適切なハンドラに処理を移譲できるなーとか思ってたら、こいつはキャッチできない。もちろん代替法があるようだが、はじめはびっくりした。
getSession(false)がない
ここからはJavaEEのSessionのはなし。PHPにはgetSession(false)相当の処理がない。
「セッションが開始されてなかったら」という処理を書くのにちょっと工夫が必要がでした。。
セッションにオブジェクトは格納できない
セッションには文字列か数字しか乗りません。
→正しくは「参照型を格納できない」なので「文字列か数字しか乗らない」正確ではありませんでした。
オブジェクトや配列をセッションに載せる場合はserializeしてから格納する必要があります。取り出すときはunserializeします。
セッションCookieの有効期限は自動的に伸びない
PHPでもセッションの有効期限を決めることができます。でも、ここで決められる有効期限はセッションスタートしてからの時間なのです。セッションの有効期限は30分だとします。時刻0でセッションを作成しました。時刻10分で再び画面にアクセスしたとき、Javaならこの時点でセッションの有効期限はそこから30分伸びます。つまりタイムアウトの時間は時刻40分ですしかし、PHPのCookieは伸びませんあくまで最初に決めた時間にタイムアウトするのです。Javaに似たセッション戦略にするには少々工夫しなければなりません
こちら、ちょっと根本的に理解が間違ってる可能性があるので調査してから編集します
セッションを消してもCookieは消えない
phpではsession_destroy
関数を使ってセッションを破棄できます。
しかし、これで消えるのはサーバ側のセッションデータのみでブラウザ側のセッションクッキーは残ってしまいます。セッションを消すときは、サーバー側のセッションデータ破棄→ブラウザのcookie削除という手順を踏まなければなりません。
User Contributed Notes
最後なのできにいった部分を。PHPのリファレンスにはUser Contributed Notesといって実際のユーザが書いたTipsとかが読めるようになってます。この文化は羨ましいなぁとおもいました。