NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

PHPとJavaのWeb開発における違い3選

本記事は  執筆デビューWeek  1日目の記事です。
✨  イベント告知  ▶▶ 本記事 ▶▶  2日目  🔰

クラウド部ウィークのトップバッターをいただきました、小林右京です。NRIネットコムにキャリア入社して10ヶ月目になります。これまでの経歴として、国内最大のメディアテクノロジー企業でWeb開発をしていたり、ベンチャー企業を創業して自社サービスの立ち上げとグロースアップを行っていたりしました。現在はJavaの新規開発案件のプロジェクトリーダーを担当しています。
前職まではPHPでの開発を行っており、JavaでのWeb開発は初めての経験なので、PHPとJavaのWeb開発における実務上の違いや気をつけるべきポイントについてまとめてみました。

1.DTOによる階層化アーキテクチャの実現

DTO(Data Transfer Object)とは、オニオンアーキテクチャなどの階層化アーキテクチャを実現する際に使用されるデザインパターンの一つです。どういうデザインパターンかというと、データの受け渡し専用のクラスを作成し、そのクラスにデータを格納し一括で受け渡す、というパターンです。
DTOはデータの受け渡し専用のクラスであるため、基本的には変数と変数の型、セッター、ゲッターのみを定義し、その他の処理は行わないというのが一般的です。オニオンアーキテクチャの場合、各階層間でのデータのやりとりをDTOを使用して行うことで、階層間の依存関係の解消やコードの可読性、保守性の向上を図ることができます。
PHPでもmodelを使用したMVCアーキテクチャの概念は存在しますが、PHPはJavaと異なり型宣言が必須ではありません。そのため、DTOを用意してデータの詰替えを行わなくとも階層間の依存関係を気にせずに実装が可能となっています。

具体的な例を示すと

<form action = “” method = “POST”>
<input type = “text” name =“userid“><br/>
<input type = “submit” value =“送信/“>
</form>

のようなフォームから受け取るデータをプレゼンテーション層では文字列として受け取りたい。しかしアプリケーション層にはINT型で渡したい。という要件があったとします。
このとき、Javaではプレゼンテーション層のDTOでは型をStringに、アプリケーション層のDTOでは型をIntegerとしてデータの詰め替えを行う必要があります。しかし、PHPの場合は動的型付け言語であり型をあまり気にせずに記載できるため、データの詰め替えを行う必要はありません。
あまりPHPに馴染みのない方向けに例を示しますと、PHPでは以下の文字列と数値を同値として扱うことが可能です。

// bool(true)
var_dump('123' == 123);

ただしこれはメリットばかりではなく、扱うデータが多い複雑なシステムになってくると型が明確でないため想定外のバグを生んでしまうことがあります。
例えば、PHP7.4までは以下のような場合にデータが一致してしまいバグとなるケースがありました。(PHP8.0ではflaseとなります)

// bool(true)
var_dump('123abc' == 123);
var_dump('abc' == 0);

Javaは静的型付け言語のため上記のようなコードはコンパイルを通らないのがいいところだと思っています。PHPに慣れ親しんでおり、DTOやオニオンアーキテクチャにふれるのがはじめての場合はいつもと違うデータの受け渡し方に戸惑ってしまう方もいるのではないでしょうか(私のこと)

2.NULLの扱いの違い

Javaで数字型と文字列型を変換する場合にString.valueOf()というメソッドを使用することがあります。このメソッドにnullが入ったオブジェクトを渡すと”null”という文字列が戻る、というのはJava開発者の間ではお馴染みのお話のようです。
PHPの場合は型の扱いが曖昧なため、null’’であり0でもあります。

PHP: PHP 型の比較表 - Manual

このためPHPでの開発に慣れ親しんだ人間がJavaの開発を行う際にNULLの扱いの考慮が漏れてしまう可能性があります。
具体的な例で示すと、MYSQLにおいてデータを格納するカラムのデフォルト値を設定せず、nullを挿入する場合です。nullを呼び出しviewで表示する際に、Javaでは適切な処理がされなければ、"null"という文字列がそのまま表示される可能性があります。
さまざまな解決方法がありますが、MYSQLのカラムにデフォルト値として’’を入れるなどの方法で設計段階でバグを予測して回避をすることもできるため、NULLの扱いについてあらかじめある程度考慮をしておくのが良いかと思います。

3.Tomcatの前にNginxの配置

PHPはスクリプト言語のためNginxやApacheなどのWebサーバ上で動きます。しかし、Javaはコンパイラ言語でありWebアプリケーションとして動かすためにはTomcatなどのサーブレットコンテナを立てる必要があります。Tomcatの前にNginxを立てる場合は、勿論ですが両者の間でのデータ通信が必要となります。

  • 通信方式としてhttpを使用するのか、ajpを使用するのか
  • トランザクションタイムアウトの設定はどうするのか

など考慮するべき点やテスト項目が増えるということは念頭においておく必要があります。
また、Tomcatはそれ自身が簡易的なWebサーバとしての機能ももっており、Tomcatのみでブラウザからのアクセスが可能となっています。PHPの開発しかしておらずJavaの開発経験がない場合、Nginxを立てなくてもいいのではないか?と思う人もいるのではないでしょうか。Tomcatはあくまでもサーブレットコンテナであり、Webサーバとしての性能はNginxよりも低いものとなっています。動的リクエストがあった場合は、NginxからTomcatに対して処理のリクエストを送り、TomcatがDBにアクセスして処理を行います。しかし静的リクエストであった場合はNginxだけで処理が可能であるため、Tomcatの前にNginxを立てることでより多くのリクエストを効率よく処理することが可能となります。

PHPの開発とJavaの開発では上記のようにシステムの構成が変わるため、タスクの洗い出しや見積もりの時点で抜け漏れの要因となる可能性があります。これまでの開発と違うために新しくどんなタスクが増えるのか?は見積もりの際に意識しておくべきポイントだと思います。

まとめ

PHPとJavaでのWeb開発の違いについて印象に残ったものをまとめてみました。ほかにもたくさんの違いがありますが、現在の私の役割がディベロッパーではなくアーキテクトであるため、設計に関する視点での違いとなりました。
言語やフレームワークによる開発の違いはやってみると考慮漏れやハマるポイントが多く、経験として非常に面白いと感じています。すべての言語やフレームワークを習得することは現実的に難しいと思いますが、それぞれの技術の違いを知っておくことでレビュー時のポイントが増えてくると思うので、定期的にアウトプットすることで整理していければと思います。

f:id:a-kisou:20210708103837p:plain

執筆者小林 右京

Webアプリエンジニア
Web系ベンチャー=>SIへ AWSの資格をとりたいお年頃