RAKUS Developers Blog

株式会社ラクスのエンジニアブログ

JavaからPHPに乗り換えて感じたこと

はじめに

はじめまして、新卒一年目のd_shrと申します。
現在、業務ではPHPを用いて開発を行っています。業務に入る前は大学在学中の研究開発や入社後の新人研修でJavaを使っていました。
在学中にPHPを学習した経験はありましたが、業務で扱うことになると入出力のチェックなど セキュリティの観点には特に注意しなければいけないため、プログラミング言語の細かい仕様まで把握する必要があると思います。
そこで変数の扱いなどにPHP独特のものを感じ、Javaとは違う仕様に戸惑うことがありました。

本記事では、JavaからPHPに転向した際に戸惑ったことを中心に、主にJava経験者から見たPHPの特徴、注意点などをまとめていこうと思います。 PHPの学習を考えている方やPHP初心者の方に少しでも参考になれば幸いです。

目次

PHPを使い始めて戸惑ったこと

業務で実装をしていて1番戸惑ったことは、変数の扱いです。
セキュリティの観点から正しい値が格納されていることをチェックする実装することがありますが、その際にPHPの変数の扱いに戸惑いました。

PHPの変数の扱い

まず、PHPは変数の型がありません。
Javaと比較すると、PHPの大きな特徴であると思います。
変数に型がないPHPでは、1つの変数に数値と文字列を格納することができます。

<?php
  $hoge = 123;
  $hoge = "hogehoge"
?>

他にも...
以下のような書き方ができることにも最初はすごく違和感を感じました。

<?php
  $hoge = 1;
  $hoge = $hoge == true ? "true" : 0;
?>

PHP側で解釈してくれるので型の宣言をする必要がなく、記述量が減るメリットはあると思います。
(可読性を考えると、このように書くことはあまりないと思いますが)
しかし、PHPが勝手に型を合わせてしまうため、Javaのような型に厳密な言語を触った後では、変数の扱いに戸惑うことがよくありました。

暗黙的な型変換

暗黙的な型変換とは、PHPが変数の型を勝手に変換してしまうことです。
例えば、以下のような変数の比較。

<?php
  $a = 0;
  $b = "hoge";
  if ($a == $b) {
    // true
  }
?>

PHPで数値と文字を比較すると、文字を数値に変換しようとします。
文字列の最初の部分により値が決まり、有効な数値がない場合は0になるため、 このような結果になります。
PHPの仕様通りに変換され意図しない結果が得られることがあるため、 PHPでの条件分岐を作る際には、変数の扱いには注意が必要です。

  • 扱いに注意が必要な例
<?php
  if ( 0 == 0 )     // true
  if ( 0 == "0" )   // true
  if ( 0 == false ) // true
  if ( 0 == null )  // ture
?>

これらは、型が正しいかどうか厳密な比較を行う演算子"==="を使うことで解決できます。
しかし、厳密な比較を行わない、switch文も注意が必要です。

<?php
switch ($hoge) {
  case 0:
    // hogeが0, "0",false, null,""などで実行される
    break;
  case "0":
    // ここは実行されない
    break;
}

// 厳密な型変換を行う場合
switch (true) {
  case $hoge === 0:
    // hogeが数値の0のときだけ
    break;
  case $hoge === "0":
    // hogeが文字列の"0"のときだけ
    break;
}
?>

型に厳密なプログラミング言語の経験がある場合は、 変数の扱いで引っかかりやすいのではないかと思いました。
PHPで正しく変数の扱うためには、変数について仕様をしっかり把握し注意しないといけません。

変数のスコープ

PHPの変数の扱いで戸惑ったことは暗黙的な型変換だけでなく、 変数のスコープでも経験があります。
変数のスコープとは、変数の有効範囲のことです。
PHPでは、関数単位のスコープしかなく、 if文やループ中のみでしか使わないような変数を定義できません。

<?php
$flag = true;

if ($flag) {
  $value = "true";
} else {
  $value = "false";
}

Javaではif文の中で定義された変数は、if文のブロックの中だけで有効です。
PHPのスコープを把握していなかったときに、以下のようなソースコードを書いたことがあります。

<?php

$flag = true;
$value = "";
if ($flag) {
  $value = "true";
} else {
  $value = "false";
}

// $valueに空を入れたくなかったときはこっちで書いた
$flag = true;
$value = "true"
if (!$flag) {
  $value = "false";
}

スコープを正しく理解していないと可読性の低いソースコードになってしまうこともあります。
スコープもプログラミング言語で特徴があるので、 各言語ごとに把握しておかないといけないことだと思います。

その他、気になったこと

上記以外で、実装中に疑問に思って調べたことや違和感を感じたことです。

配列の値渡し

Javaのデフォルトは参照渡しですが、PHPのデフォルトは値渡しです。
PHPでも参照渡しはできます。

  • 値渡しの例
<?php
$array = [1,2,3];

$copy = $array;

$copy[1] = 5;

print_r($array);
print_r($copy);

$array: Array ( [0] => 1 [1] => 2 [2] => 3 )
$copy: Array ( [0] => 1 [1] => 5 [2] => 3 )

  • 参照渡しの例
<?php
$array = [1,2,3];

$copy = $array;
$copy2 = &$array;

$copy[1] = 5;
$copy2[1] = 5;

print_r($array);
print_r($copy);
?>

$array: Array ( [0] => 1 [1] => 5 [2] => 3 )
$copy: Array ( [0] => 1 [1] => 5 [2] => 3 )

まとめ

JavaからPHPを扱うようになって戸惑ったことや違和感についてまとめてみました。
当初はこの違和感に嫌気が差していましたが、今ではPHP洗脳され慣れてしまいました。
PHPを学び始めた方や、次の新卒で入社される方に参考になればと思います。
また、同じような境遇の方に共感いただければ幸いです。

Copyright © RAKUS Co., Ltd. All rights reserved.