---
layout: "@/layouts/MarkdownLayout.astro"
---
import Toc from "../../components/Toc.astro";
export const title = "HTMLをPHP内で扱う";
import DockerLink from "@/components/DockerLink.astro";
# {title}
## TOC
## 動作環境
このセクションのサンプルコードは、以下のコマンドを入力することで実際の動作を確認できます。
```bash
cd path/to/this/project # docker-compose.ymlのあるディレクトリへ移動してください
docker compose up -d
```
## PHPを書いてみる
JavaScriptをHTML内に直接書くには、`<script>`タグの中にJavaScriptのコードを書くことで実現できました。
しかしこの`<script>`タグの中に、PHPのコードを書くことはできません。
PHPのコードをHTML内で使いたい場合は、PHPの開始を示す `<?php` と終了を示す `?>` を使って、PHPのコードブロックを作成します。
<DockerLink href="sample/php/index.php" />
```php file=public/sample/php/index.php
public/sample/php/index.php
内容を取得できませんでした
```
<br />
これは、以下のように解釈されます。
```html file=public/sample/php/index_output.html title="public/sample/php/index.php (処理後)"
public/sample/php/index_output.html
内容を取得できませんでした
```
<br />
少し詳しく見ていきましょう。
phpのうち、以下の部分がphpのコードです。
```php file=public/sample/php/index.php {1-8,17}
public/sample/php/index.php
内容を取得できませんでした
```
2つのphpのコードブロックがあり、最初のコードブロックでは変数`$name`と、`greeting`関数が定義されていることがわかります。
そして`<?php echo greeting($name); ?>`の部分で、その`greeting`関数を呼び出していることがわかります。
なお、このpphpコードブロックの外側は、すべてHTMLとして扱われます。
処理語に出力されたHTMLと比較してみましょう。
`greeting`関数があった場所が、`こんにちは、もつにさん!`に置き換わっていることがわかりますか?
`greeting`関数の手前にあった`echo`は、ファイルに文字列を出力するための命令です。
つまり、`greeting`関数が返した文字列を、HTMLに埋め込んでいるという動作をしています。
<br />
<br />
phpを書いたとき、実際に出力されているのは**phpの外で書かれている部分**のみです。
それは同時に、phpから出力しなければ、phpで書かれた内容は**画面に表示されない**ということでもあります。
phpはあくまで、今回であればHTMLを**適切に出力するための道具**として使われていることがわかります。
## いろいろな書き方
### データから必要な情報だけを取り出す
当然といえば当然ですが、配列などのデータから必要な情報だけを取り出して表示することもできます。
[Webサーバーの目的](000-introduction#web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E7%9B%AE%E7%9A%84)
で挙げたような、本来見せたくない情報を隠すことができます。
<DockerLink href="sample/php/hide_data.php" />
```php file=public/sample/php/hide_data.php
public/sample/php/hide_data.php
内容を取得できませんでした
```
<br />
```html file=public/sample/php/hide_data_output.html title="public/sample/php/hide_data.php (処理後)"
public/sample/php/hide_data_output.html
内容を取得できませんでした
```
### 繰り返す
たくさんのデータを扱いたいとき、繰り返し処理を使うことができます。
HTMLの中で`foreach`を使うとき、`{`、`}`の代わりに、`:`と`endforeach;`を使うことができます。
動作には影響しないので、決められたルールがなければ好みのものを使うといいでしょう。
```php
<?php foreach ($items as $item): ?>
<!-- ここはHTML -->
<?php endforeach; ?>
```
<br />
<DockerLink href="sample/php/loop.php" />
```php file=public/sample/php/loop.php "foreach"
public/sample/php/loop.php
内容を取得できませんでした
```
<br />
```html file=public/sample/php/loop_output.html title="public/sample/php/loop.php (処理後)"
public/sample/php/loop_output.html
内容を取得できませんでした
```
### 表示条件
HTMLの中で見せ方を変えたいときなど、`if`による条件分岐を使うこともできます。
`foreach`と同様に、`{`、`}`の代わりに、`:`と`endif;`を使うことができます。
```php
<?php if (条件): ?>
<!-- 条件に一致するときのHTML -->
<?php elseif (条件): ?>
<!-- 別の条件に一致するときのHTML -->
<?php else: ?>
<!-- どの条件にも一致しないときのHTML -->
<?php endif; ?>
```
<br />
<DockerLink href="sample/php/if.php" />
```php file=public/sample/php/if.php "elseif" "endif" "else" "if"
public/sample/php/if.php
内容を取得できませんでした
```
<br />
```html file=public/sample/php/if_output.html title="public/sample/php/if.php (処理後)"
public/sample/php/if_output.html
内容を取得できませんでした
```
## まとめ
- phpは、あくまでも出力したい内容を生成するための道具
- 実際に出力されるのはphpの外側に書かれた部分と、phpから出力された内容のみ