ROBOT PAYMENT TECH-BLOG

株式会社ROBOT PAYMENTのテックブログです

JavaエンジニアがPHPに触れて苦労したこと

始めまして。
株式会社ROBOT PAYMENTで請求管理ロボの開発を担当している上原です。
株式会社ROBOT PAYMENTは12月に入社し、今月で約半年となります。

私は、前職では主に以下を経験があります。
- Javaでバックエンドの追加開発・運用(約3年)
- Reactでフロントエンド新規開発・運用(約2年)
- ReactNativeでのモバイルアプリ新規開発(約2年)
また、Javaの方は個人的に相性があっていたので、楽しく勉強が捗り「Java SE 11 Programmer II(Gold)」の資格も取得したので、
Javaを使用した基本的なweb開発はある程度可能なレベルだと思っています。

そんな中、他の言語での開発にも触れて、いろんな方向からプログラミングの楽しさを学びたいと思い、PHPで開発している当社に入社いたしました。
今回は「JavaエンジニアがPHPに触れて苦労したこと」として今のところまだ上げればたくさんでてくるのですが、今回はそこから3点ほどピックアップしたいと思います。

1. 開発環境

まず、最初に困ったのは開発環境(コーディング環境)です。
私は、エディタとしてVSCodeを使用しているのですがJavaの場合、とりあえず以下の拡張機能を入れてれば無料で欲しい機能はすべて使用できるので、とりあえずこれで間違いなし。でした。
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack

環境整備にあたって、どの拡張機能が開発しやすく自分にあっているかの選定から始めたのですが、PHPの場合、いくつか拡張機能は提供されているのですが一部機能からは有料といったものが多く、結果的に何回も迷い、以下のDEVSENSE社の拡張機能に落ち着きました。
(私の設定の問題なのか、メモリ消費量には今だに困ってはいますが。)
https://marketplace.visualstudio.com/items?itemName=DEVSENSE.phptools-vscode

2. $の使用箇所の違和感

これは、ちょっとしたことなのですが
未だに$this->message のような書き方に慣れないといった慣れ問題ではありますが、単純な$のつけ忘れや、messageの方には$が付かないことにまだたまにモヤモヤしています。
(また、ちょっと脱線ですが、試しにJavaコードと同じようなクラスを書いてみたのですが、PHPで型情報を書くと意外にも、PHPのほうがメソッドの記述量も多いことにも気づきました。)

<?php
namespace App\Logic;

class Sample {

  public function __construct(
      private string $message
  ) {} // PHP8以降から

    public function process(): void {
        $this->xx($this->message . "abc");
    }
    
    private function xx(string $msg): string {
         return $msg;
    }
    
}
package com.example.app.logic; 

public class Sample {

    private String message; 
    
    public Sample(String initialMessage) {
        this.message=initialMessage;
    }

    public void process() {
        xx(message + "abc");
    }
    
    private String xx(String msg) {
         return msg;
    }
    
}

3. Exception周りの仕様

Javaでは「検査例外」「非検査例外」があり、「検査例外」はtry-catchで対処もしくは、throwsで呼び出し元に知らせないとコンパイラに注意される。
なので、基本的に例外処理しなければ!!となるのですが、 PHPの場合は、すべて「非検査例外」のような立ち位置でtry-catchで対処をしなくても誰も注意してくれません。。
(当社では、PHPStanを導入しているので実際には定義していればPHPStanがエラーを吐いてくれます。)
また、これは私の勉強不足なのですが以下のようなエラーまわりの歴史的背景をキャッチアップできていないので、まだphpの例外まわりははっきり理解できていません。
https://www.php.net/manual/ja/language.errors.php7.php

その他にも・・・

他にも、やはりJavaの経験が長いので、以下のようなPHPでの曖昧さに恐怖感や戸惑うことがあります。
- PHPの便利すぎる連想配列の使用(型も定められてないなど便利すぎるが故に、使用するかわからない値もとりあえずなんでも入れちゃおう!ができる。)
→JavaではMapが似たような定義ではあるが、型を固定しなければならない。(違反すれば即座にコンパイルエラー)また、基本的にはDTOクラスを用いる傾向がある。
- phpはコンパイラがいないので、記述があっているか不安になる。(実際に動かすまで安心できない。)
→ Javaはコンパイラが即注意してくれるので、手戻りが圧倒的に少ないし、書いた直後に安心感も得られる。

  • ちょっとスコープを広げると
    • やはり、DIを使うとなるとJavaのほうが安定している(Springを使うことによって導入・記述しやすい。)
    • Javaのほうが、Apacheが提供している「Apache Commons Lang」やGoogleが提供している「guava」など、安心の便利ライブラリが多数ある。

まとめ

今回書き出していくと、やはりまだ私がPHPと仲良くなれてないということがわかりました。
ReactでJavaScriptも触ってきましたが、PHPにはまた違った独特な雰囲気を感じています。(traitやマジックメソッドなど)

しかし、最近のPHPでは、「未定義変数へのアクセス不可」「型の導入」「immutableフィールドの宣言」など曖昧さがなくなってきており、JavaのようにOOPで実装していけるような仕様変更が多々見られます。
また、nativePHPというphpでNativeアプリ開発が可能なおもしろそうなツールまで誕生しています。
PHPは、今後も進化していく言語だと思いますので、個人的にももっとPHPの曖昧さも理解しつつ、柔軟なコードを組み立てていけるようになっていきたいと思います。



We are hiring!!

ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!


www.robotpayment.co.jp