[WIP] PHP 入門

:::note info
趣旨
作りたいシステムを思いついて少しずつ取り組んでいる所なのですが、
~~ 現状の力量ではかなり難しいことがわかった段階 ~~です。
切り替えてやったことの派生版で理解を深めたり、デザインと登録・参照するデータを変えて表示・更新・削除ができるようにします。

心が折れないように、わかったことをここに残しつつ、
少しでも進めていこうという気持ちで書いています。
- 使用エディタ：eclips
:::

# 出力する
PHP で何かしらブラウザに出力する場合、`echo` を使います。

## 文字列を出力する
文字列をダブルクォーテーション（`””`）で囲みます。
Hello World! を出力するには、前に`echo`をつけて全体を`<?php` と `?>` で囲むことで、ブラウザ上に表示できます。

```php:PHP
<?php echo "Hello World!"; ?>
```
```:ブラウザでの表示結果
Hello World!
```

文字列は複数行記述もできます。その際、コード全体の見通しが良くなるよう改行も可能です。
ただし、ブラウザ上は改行されません。

```php:PHP
<?php
    echo "Hello World!";
    echo "Hello World!";
    echo "Hello World!";
?>
```
```:ブラウザでの表示結果
Hello World!Hello World!Hello World!
```
ブラウザ上でも改行表示にしたい場合、文字列内に`<br>`をつけます。
echo は文字列だけでなく、HTMLタグもそのまま出力できます。
```php:PHP
<?php
    echo "Hello World!<br>";
    echo "Hello World!<br>";
    echo "Hello World!<br>";
?>
```
```:ブラウザでの表示結果
Hello World!
Hello World!
Hello World!
```
## 変数を出力する
と、その前に変数を出力するには、変数の定義が必要です。
変数の定義は、`$変数名 = 値;` が基本形です、変数名の前に `$` をつけます。
PHPの場合、`$変数名;`という変数の宣言だけではなく、値を代入した初期化（定義）までが必要です。
というのもエディタが eclips だからなのか、それ以外の設定や環境のせいなのか調査前ですが、初期化していない変数を関数などで使用すると、エラーになるためです。
```php:PHP
$text = "Hello World!"; // OK
$text; // NG
```
変数を出力するには、何も囲まず記述できます（変数の初期化で文字列をダブルクォーテーションで囲んでいるので二重に囲む必要がない）。
```php:PHP
<?php
    $text = "Hello World!";
    echo $text;
?>
```
```:ブラウザでの表示結果
Hello World!
```
## 文字列と変数を同時に出力する
"文字列" と 変数を同時に出力したいとき、echo で分けてもいい。
```PHP:PHP
<?php
    $text = "Hello World!";

    echo "Hello World!";
    echo $text;
?>
```
```:ブラウザでの表示結果
Hello World!Hello World!
```
今回のような短いセンテンス（文字量）であれば、*連結* を使って同じ表示結果にできます。
文字列と変数を`ドット（.）`で繋げることで連結できます。
```PHP:PHP
<?php
    $text = "Hello World!";
    echo "Hello World!".$text;
?>
```
```:ブラウザでの表示結果
Hello World!Hello World!
```
## 文字列と変数とHTML要素を出力する
これまでの記述方法の組み合わせでできます。
変数をダブルクォーテーションで囲む必要はなく、文字列と変数は`ドット（.）`で繋げます。
```PHP:PHP
<?php
    $text = "Hello World!";
    echo "<p>".$text."</p>";
?>
```
```:ブラウザでの表示結果
Hello World!
<p>Hello World!</p>　// ソース上の表示
```
同じ要領で「属性値がある HTML」を扱うときは、少し工夫が必要です。
```PHP:PHP：失敗例 imgタグの alt 属性に変数を使う
<?php
    $text = "Hello World!";
    echo "<p><img src="hoge.png" width="65" height="65" alt=".$text."></p>";
?>
```
上記の記述だと、エラーが表示されます。
```sql:エラーコメント「; か , をつけ忘れている」
Parse error: syntax error, unexpected 'hoge' (T_STRING), expecting ';' or ',' in...
```
先に結論として成功例を記述します。
```PHP:PHP：成功 imgタグのalt属性に変数を使う
<?php
    echo '<p><img src="hoge.png" width="65" height="65" alt="'.$text.'"></p>';
?>
```
何がどう解釈されているかを自分なりに理解した方法でまとめます。
PHPはダブルクォーテーションの間を「一まとまりの文字列」として扱います。
失敗例を、文字列のまとまりごとに改行すると、以下のようになります。
```PHP:PHP：失敗例
    "<p><img src="
    hoge.png
    " width="
    65
    " height="
    65
    " alt="
    .$text.
    "></p>"
```
つまり、pタグの開始タグから終了タグまでをダブルクォーテーションで囲んだつもりが、
src属性のダブルクォーテーションの開始で区切られてしまった。
というのが原因です。

このようにHTML属性を扱う場合、全体を`シングルクォーテーション（'）` で囲みます。
```PHP:PHP：改善中
    echo '<p><img src="hoge.png" width="65" height="65" alt=".$text."></p>';
```
しかし、ドットと変数が表示されるだけで「変数の値」が展開されません。
```:ブラウザ（Firefox/MacOS）での表示結果
.$text.
```
おそらく以下のように柔軟に解釈されたことが要因なのかなと思っています。
```PHP:PHP：失敗例
    '<p><img src="hoge.png" width="65" height=”65" alt="
    .$text.
    "></p>'
```
ブラウザが良心的に解釈してくれて、
シングルクォーテーションの開始とalt属性の開始クォートまでを一区切りに、
.$text. と、alt属性の終了クォートとシングルクォーテーションの3つに分割されているようです。
シングルクォーテーションで囲みたい範囲を指定し直します。それが前記した成功例です。
```PHP:PHP：成功
    // '文字列'.変数.'文字列'
    '<p><img src="hoge.png" width="65" height="65" alt="'
    .$text.
    '"></p>';
```
このように、少しずつ切り分けて考えるとつまずきも少なくなると思います。

余談：15年ほど前に別言語で同じ疑問を持ったので、同題材で混乱していた隣席の子に説明をしたら「わかりそう…！」と言ってもらえたので、初学者の引っかかりポイントが少しわかった気がしました。
この元ネタのテキストももっと長い文字列で詳しい解説もなかった上に、`'`なのか`”` なのか区別がなく点が3つ並んで見えて余計に難しく捉えられていたと思います。これまで意識していませんでしたが書籍のフォント選びも大事な点だなと思いました。
## シングルクォーテーションやダブルクォーテーションを出力する