Javaしか知らない10年目プログラマが転職を機にPHPを学び始めた話 #1

# 本記事について

## 対象読者

* これからPHPを学ぼうとしている方
* ある程度プログラミング経験がある方
* 転職による環境の変化に不安を抱いている方

## 本記事作成の経緯

アルバイトから数えて10年ほどJavaとSpringbootで受託開発を行っていましたが、
初めての転職を機にPHPとLaravelを使った自社サービス開発の環境へ飛び込んで得た、
知見と感想を共有させてください。

# PHP入門

## PHPとは？

私: 「PHPとは？」

ChatGPT:
>‐‐‐
PHPは、主にウェブ開発に使用されるスクリプト言語です。
PHPは「PHP: Hypertext Preprocessor」という再帰的な略称であり、
動的なウェブページやウェブアプリケーションを作成するために広く利用されています。
‐‐‐

PHPの特徴として
*Hypertext Preprocessor* である。ことが重要であり、
つまり、文字列の扱いに長けているといえます。

Javaが安全な計算処理に適していることを考えると、
言語として**利用目的が大きく異なる**ことを理解する必要がありました。

## 型の考え方について

今までの私の常識として

私:「Javaの型付けについて、他の言語と比較しての優位な点を教えて」

ChatGPT:
‐‐‐以下、抜粋‐‐‐
>Javaの型付けについて、他の言語と比較しての優位な点をいくつか挙げます
>
>‐‐‐
>変数の型が宣言時に明示的に指定されます。これにより、コンパイル時に型エラーを検出することができます。
>‐‐‐
>変数の型が厳密にチェックされ、異なる型の間での暗黙の型変換は行われません。
>‐‐‐
>Javaはジェネリクスをサポートしています。
>ジェネリクスを使用することで、型安全なコレクションや汎用的なアルゴリズムを実現するために役立ちます。
>‐‐‐
>これらの特徴により、Javaは安全性、信頼性、保守性に優れたプログラムの開発を支援します。
>‐‐‐

型付けはプログラムの**安全性を担保するため**のものという理解でした

しかし、PHPでは型を持つが**文字列操作のために柔軟に記述できる**仕様になっているようで、
型は指定せずとも実行時に変換できるかどうかで判断できます。

- Javaは静的型付け言語であり、コンパイル時にチェックされる
- PHPは動的型付け言語であり、実行時にチェックされる 

## 文字列リテラル

Javaユーザーからすると、PHPの文字列リテラルには一種のカルチャーショックを受けました。

以下にいくつかご紹介します。

### 基本表現

```php
// 文字列の宣言はどちらでも良い。と言われているが、、、
$str1 = "text1";
$str2 = 'text2';
```

動的型付け言語の文字列の宣言としてはよくあるパターンではあるが、
調べていくと、どちらでも良いと一概には言えないようで、

違いとしては大きく2つ
* 利用できるエスケープシーケンスが異なる
* 変数展開ができるかどうか

### エスケープシーケンス

`"`と`'`で利用できるエスケープシーケンスが異なるそうです

#### `"`の場合

```text
\n    改行
\r    キャリッジリターン
\t    水平タブ
\v    垂直タブ

\\    バックスラッシュ
\$    ドル記号($)
\"    ダブルクオーテーション

他にも複数あり...
```

#### `'`の場合

```text
\'    シングルクオーテーション
\\    バックスラッシュ
```

また、文字列中に`"`または`'`を含める場合

```php
echo "This is a 'pen'";
// -> This is a 'pen'

echo 'This is a "pen"';
// -> This is a "pen"
```

と、表現できるようです

### 変数展開

以下のように表現できます

```php
$str1 = 'World';

echo "Hello {$str1}!";
// -> Hello World!

echo 'Hello {$str1}!';
// -> Hello {$str1}!
```

:::note

**追記**

確認したところ`{}`が無くても変数展開可能なようです
```php
$str1 = 'World';

echo "Hello $str1!";
// -> Hello World!
```

ただし、変数の後ろに文字や数字（変数名に利用できる文字）が隣接する場合を除く
:::

以上から

* `"`は長い文字列またはテンプレートに適している
* `'`は短い文字列に適している

### おまけ
#### 文字列連結

正直、直感的じゃなかった

```php
// こうじゃない
echo 'Hello ' + 'World!';
```

主に以下で実行できる

* 演算子を用いる
* 変数展開を用いる

```php
// 演算子を用いて
$str = 'Apple';
$str .= 'Orange';

echo $str . 'Peach';
// -> AppleOrangePeach
```
```php
// 変数展開を用いて
$apple = 'Apple';
$orange = 'Orange';
$peach = 'Peach';

echo "{$apple}{$orange}{$peach}";
// -> AppleOrangePeach
```

こんな感じ

`"`の場合はテンプレートっぽいので理解できるが、
`'`の場合は変な感じ

:::note

**追記**

#### ヒアドキュメント構文

- エンドトークン（識別子）を利用する
    - 開始と終了が同一であればなんでも良い
- `"`と`'`はエスケープされる
    - HTML出力が目的のように思われる
- 変数展開が可能

```php
$str1 = "World";

$doc = <<<EOD
Hi!
Hello {$str1}!
This is "PHP"
EOD;

echo $doc;
// -> Hi!
//    Hello World!
//    This is "PHP"
```

#### Nowdoc構文

- エンドトークン（識別子）を利用する
    - シングルクォートで囲う
    - 開始と終了が同一であればなんでも良い
- `"`と`'`はエスケープされる
    - HTML出力が目的のように思われる
- 変数展開はできない

```php
$str1 = "World";

$doc = <<<'EOD'
Hi!
Hello {$str1}!
This is "PHP"
EOD;

echo $doc;
// -> Hi!
//    Hello {$str1}!
//    This is "PHP"
```

HTMLのテンプレートのために特化しているように見える
それぞれの使い分けとしては

- HTMLの場合はヒアドキュメント構文
- HTML以外の場合はNowdoc構文
:::

## 文字列リテラルの使い分け

私の使い分けとしては以下のようにしようと思います

* 複数行になる、またはテンプレートが必要な場合は`"`が適している
* 単行で短い文字列の場合は`'`が適している

# 最後に

一旦、ここまで

柔軟に表現できると言えるが、チーム開発の場合に表記揺れが大きくなりそう。という所までの理解です

まだまだ、業務で使えるレベルの知識では無いですが、
ChatGTPに既存のコードの分解して解説してもらい、
PHPの細かい仕様は公式ドキュメントで確認しつつと、
今までの経験を活かしつつ学び進めることができています

最後に
上記の理解の誤り、実装の誤り等あればご指摘いただけると幸いです

次回はこちら

https://qiita.com/naoto24kawa/items/4594d9a0711609a9284c

以上