概略
業界に入ってから長らくJavaをメインで使っていたプログラマである筆者が、業務でPHPを使うようになった際にはまったことを思い出して列挙していく。
詰まった時しか公式リファレンスとか見ないから何となくでやるとびっくりしてしまう。
マルチスレッド
Javaだとマルチスレッド当たり前なので、シングルトンだったりstaticな変数を更新していたりすると「そんなバカな、死にたいのか!?」と思ったりしたが、Webアプリケーションとして動くPHPでは通常リクエストごとに別プロセスが起動していてそんな問題になることはないようだった。
arrayがプリミティブ風に動く
内部的にどういう扱いになっているのか具体的にわかっていないけれど、arrayを代入したら別の配列となる。
Java的な常識だと同じオブジェクトの参照となるイメージだったから衝撃だった。
javaだと
public class Main {
public static void main(String[] args) {
int[] array1 = {10, 20, 30};
int[] array2 = array1;
array2[1] = 40;
System.out.println(array1[1]); // 40
}
}
PHPだと
<?php
$array1 = [10, 20, 30];
$array2 = $array1;
$array2[1] = 40;
echo $array1[1]; // 20
組み込み関数がユーザ issetは通常の関数と異なる動作をする
issetなどに渡すものは内部が実行された結果を渡されるのではない。
issetは関数ではなく言語構造なのだそうだ。指摘ありがとうございます。
確かに公式にちゃんと書かれていた。
https://www.php.net/manual/ja/function.isset.php#refsect1-function.isset-notes
Javaかけるから何とでもなるでしょーって調子こくとダメだな。。
$null = null;
echo isset($null[1]); // ここでアクセスできないとなるかと思いきやfalseが返る
some_method($null[1]); // ここではエラー発生する
ケースインセンシティブなところがある
大文字小文字を気にしてないところがある。
気にするところもある。
なんだこれ
<?php
function hoge(){
echo 'hogehoge';
}
class MyClass {
function fuga(){
echo 'fugafuga';
}
}
HOGE(); // hogehoge
ECHO PHP_EOL;
$class = new MYCLASS();
$class->FUGA(); // fugafuga
変数の$が重ねられる
僕自身がJavaから入ったとか関係なく衝撃だった
リフレクションとかのイメージ
<?php
function some_method(){
echo 'piyo';
}
$hoge = 'some_method';
$fuga = 'hoge';
$$fuga(); // piyo
参照渡しできる
これは単純にJavaにないからほえーっとなった
<?php
function some_method(&$hoge){
$hoge = 'fuga';
}
$hoge = 'hoge';
some_method($hoge);
echo $hoge; // fuga
ブロックスコープがない
以下のコードだとコンパイル通らないという感覚になってしまう。
<?php
$bool = true;
if ($bool) {
$message = 'hoge';
} else {
$message = 'fuga';
}
echo $message; // hoge
一旦これくらいで。