NRIネットコム Blog

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

Javaだらけの頭でPHPに出会うとこうなる

はじめに

初めまして。2023年度入社、入りたてほやほやの増田です。
今回は、Javaが詰め込まれた頭で初めてPHPを見て、感じたことやつまずいた箇所をまとめていこうと思います。
PHP使いまくってるよ、という方は、「最初はこんなところで悩んでたか~」
PHPを全く知らないよ、という方は、「こんな書き方するんだ~」
といった感覚で読んでみてください。
備忘録のような内容ですが、最後までお付き合いいただけると嬉しいです。

PHPに出会うまで

私がプログラミングを始めたのは大学生の時です。
情報科学部に入り、C言語とPython、そして少しだけJavaを学びました。
大学時代に私がJavaに抱いた印象は、

「ムズッ!無理」

向き合って理解すれば良かったのですが、当時の私はPythonに逃げてしまいました。
そしてJavaが嫌いなまま大学を卒業し、ネットコムに入社しました。

ネットコムでは入社後に様々な研修を行うのですが、なんと今年度はJava研修が1か月以上
嫌だ嫌だ~~!!と心の中で駄々をこねながらも(声に出ていたかも)、学んでいくとかなり理解できるようになり、
「まだ不安だけど、少しは業務で役に立てるかな…」
という状態で、研修期間を終えました。

そして迎えた配属初日。
チームリーダーから業務の説明が行われる中で、衝撃の一言。

「開発で主に使用する言語はPHPです」

( ( ( Javaじゃない! ) ) )

これが、PHPとの初めての出会いです。
ようやく仲を深めたJavaとは早くもお別れとなりました。またね。あんまり会いたくないけど。

PHPとは? 

            
PHPについて、とてもざっくりと説明をしていきます。
PHPとは、WebアプリケーションやWebサイト開発に適しているスクリプト言語です。
HTMLに埋め込むことで、動的なWebサイトを作ることができます。
Javaと比較すると、Webに比重を置いているのがPHP汎用性に優れているのがJavaといった感じです。

ソースコードを見て感じたこと

なんとなく読めそうなのに読めない!

チームリーダーからは、「Javaができたらある程度は読めるよ」と言われました。
少し安心して、実際にソースファイルを見てみると…絶妙に読めない
全体的に記号が多く、具体的に何の処理が行われているのかがさっぱり分かりません。
本当に使えるようになるのか?と冷や汗が止まりませんでした。

超初心者がつまずいた箇所7選

1. PHPの終了タグ「?>」が見つからない

PHPファイルの最初には必ず<?phpが書いてあることを発見。
開始タグと終了タグで囲むのか~と思って見ていると、ファイルの最後を見ても終了タグがありません。
大丈夫なのかと不安になりますが、実は推奨されている書き方なんです。

PHPでは、終了タグ?>以降に空白や空行が入ってしまった場合、誤作動が生じてしまいます。
この誤作動を回避するため、PHPのみで書かれたファイルでは、 終了タグを省略した方が良いそうです。

2. 「$」が大量発生。変数の型がわからない。

PHPでは、変数の頭に$を付ける必要があります。
一方で、変数を使用する際に型を定義する必要はありません

最初はこのルールに慣れず、何度も赤い波線で怒られました。
型宣言しなくていいことに最初は「楽!」と感じましたが、 ソースを見ていて「この変数の型は何だったっけ?」となるので 少し不便です。

3. 「->」と「=>」の違い

やたら現れる->=>
形が似ているので、意味も似ているのかと思ったら全く違いました。

->アロー演算子という名前で、プロパティやメソッドにアクセスする場合に用いられます。
左辺にはクラスのインスタンスを、右辺には、左辺のクラスが持つプロパティやメソッドを指定して使用します。

=>ダブルアロー演算子という名前で、連想配列のキーに値を設定する場合に用いられます。
連想配列とは、キー(添え字)と値で出来た配列のことです。
通常の配列では、添え字は0,1,2,...というように0から始まる連番の整数ですが、
連想配列では好きな名前を付けることができます。
=>(ダブルアロー演算子)では、$key => $valueという風に、左辺にキー、右辺に値を指定します。

これを知ってからソースを見ると、かなり理解度が上がりました。

4. 三項演算子みたいな「変数 ?? ''」

変数 ?? ''null合体演算子といいます。
PHP以外にも、C#などの言語で用いられるようです。

null合体演算子変数 ?? ''は、左辺の変数に値が定義されていない(null)場合、 右辺(ここだと空文字)を返します。
変数が定義されていなくても何かしらの値が入るので、 「何も入ってないよー」というエラーを回避できます。
(恥ずかしながら、ここでようやく「文字列の型にnullは入れられない」ということを学びました)

5. 「self::」と「$this」の違い

self::$this->はとても似たような使われ方をしており、 未だに混乱することがあります。

self::自クラス$this自分自身のオブジェクトを表します。
クラス定数やstatic変数といった静的なプロパティ(自由に値を変えられないもの)に アクセスする際は、必ずself::を使います。
一方、クラスをインスタンス化して、そのクラスのメンバ変数や メソッドにアクセスする際は$thisを使います。

例えば、セッションに値を格納するために、クラス内で定義したsession()というメソッドのsetという処理を使うとします。
定数CONSTをセッションに格納したいときは

$this->session()->set(self::CONST)

という書き方をします。

ちなみに、PHPでは変数の前に$を付けるといいましたが、 $this->に続く変数には$は付けません。難しい!

6. twigファイルとは?

twigはPHPのテンプレートエンジンです。

テンプレートエンジンとは、テンプレート(ひな形)と、フロントやバックエンドからの 入力データを合成して、Webページなどの成果ドキュメントを出力するものです。
twigを利用することで、DBの値を表示できたり、 HTMLにPHPを直接書き込むよりも簡潔で分かりやすくなるといったメリットがあります。

twigでは、if文やfor文などの処理は{% 処理 %}、変数は{{ 変数 }}、 変数や配列の定義は{% set 変数=値 %}という書き方をします。
最初、この独特な書き方の理解に少し苦しみました…。

7. 「空かどうか」の判定方法

変数や配列が空かどうか判定する方法として、 isset empty is_nullなどがあります。
それぞれ「空」の判定基準が異なっているため、 使用する際は注意が必要です。

例えば、issetemptyでは、数字や文字列の「0」も空と判定してしまいます。
これらの違いを分かりやすくまとめているサイトがありました。以下をご参照ください。

これは何度見ても覚えられません。
空とはなにか。哲学ですね。

おわりに

以上、PHPに初めて触れて感じたこと、つまずいたことをまとめてみました。
割と理解してきた感を出していますが、まだまだ分からないことだらけです。(実際、この記事を執筆中に大きめのバグを発生させました。嗚呼)
また、私はDBが苦手なのですが、私のプロジェクトではPHPとDBがかなり連携していました。
DBと仲良くなるしかない。 そう覚悟を決めてPHPと向き合っています。

今回の内容は初歩中の初歩ですが、この記事を通じて、PHPを1mmも知らないという人が少しでも興味を持ったり理解できるきっかけになれば嬉しいです。

執筆者:増田志帆 / システムエンジニア / BUMP OF CHICKENとサンフレッチェ広島と猫が好きです