はじめに
はじめまして、新卒一年目の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を学び始めた方や、次の新卒で入社される方に参考になればと思います。
また、同じような境遇の方に共感いただければ幸いです。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
forms.gleイベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com