PHPはプログラミング初心者から人気の言語なので、最初に習得した言語がPHPだったという人もいるのではないでしょうか?
でも他のプログラキング言語を経験して、改めてPHPに戻ってくるとPHPって独特な感じがするんですよね。
そこで今回はPHP以外のプログラミング言語経験者がPHPを学習する時につまずきそうなポイントをまとめてみました!
変数の名前は「$」で始める
例えば変数は以下のように宣言します。
$a = 1;
この書き方は他では中々ないですよね。
シェルは変数を参照する時に$を使いますが、PHPは宣言するも$が必要です。
基本的に参照ではなく値のコピーが渡される
PHPは変数に代入するとき参照ではなく値のコピーが渡されます。
$a = 1;
$b = $a; // $aのコピーが渡される
これはプリミティブ型だとそんなに珍しくはないかもしれません。
C/C++は実体は基本コピーが渡されますし、
Javaでもプリミティブはコピーが渡されます。
珍しくはないのですが、参照もあるのでちょっとややこしくなります。
参照は変数の前に&を前につけて渡すことができます。
$a = 1;
$b = &$a; // $aの参照が渡される
$b = 2;
echo $a; // 2 が出力される
コピーしちゃっていいのか、参照を使ったほうがいいのかなどと考えだすと面倒臭いですよね。
でも基本的にはコピーしちゃった方が安全だと思いますが、
こういったところの違いを意識しながらプログラミングをしなければいけないところは、初心者にとって少しハードルが高い気がしますよね。
配列もコピーが渡される
PHPは変数に配列を代入するときもコピーが渡されます。
$a = [1, 2, 3];
$b = $a; // コピーが渡される
$b[1] = 4;
$a[1] == 2; // true
配列もコピーが渡されるのはヤバくないですか??
やっぱりよくない仕様な気がするんですよね。
参照で渡し忘れることとか結構ありそうだし。
オブジェクトは参照渡しっぽい挙動をする
だとするとオブジェクトも値渡しなのかと思いきや、
オブジェクトはデフォルトで参照渡しっぽい振る舞いをするのです。そこは違うんです。
安心してください。
実際にはオブジェクトは参照ではないらしいですが、参照渡しのようなものでしょう。文字列の結合には演算子「.」を使う
なぜ「+」とか「++」にしなかったのだろう。
JavaもPythonもRubyもJavaScriptも「+」なのに。なんか違和感ありますよね。
Elixirも文字列の結合は「+」ではなく「<>」ですが、そこはなぜか許せる。
メンバーアクセスに「->」を使う
C/C++っぽくたかったんですかね。
なぜ?
まぁいいけど。
サーバ内でデータを共有するには永続化するしかない
PHPはApache上で動くCGIなので、リクエスト毎に別プロセスが作られます。
なので、メモリを使ってリクエスト間でデータを共有することはできません。
デフォルトではセッションもディスクに保存されるようです。
ウェブアプリ内でデータを共有するには、外部ファイルやデータベースに保存するしかありません。
まとめ
以上、PHPのつまずきポイントでした!