7.PHPファイルにHTMLを書いてみよう

PHPファイルには、HTMLを直接記述することができます。

今回は、PHPファイルにHTMLを書いていきます。

PHPにHTMLを書いてみよう

sample/index.phpに、HTMLを書いていきます。

sample/index.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

このサイトのデータは、別ファイルで管理していることにします。

同じディレクトリに「data.php」というファイルを作成して、以下のような記述をしてください。

sample/data.php
<?php

$members = array(
    '田中', '鈴木', '佐藤'
);

メンバーの一覧を配列にして、代入しています。

ファイルの取得は、require_once関数を使います。

sample/index.php
<?php
require_once('./data.php');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

require_onceはファイルを1回だけしか読み込めません。同一のページで同じデータを何度も取得する必要はないため、require_onceを使います。

include_onceという関数もファイルを読み込む時に使いますが、require_onceはファイルが存在しなかった時に処理をストップします。

逆に、include_onceはファイルが存在しなくても処理はストップしません。

sample/index.php
<?php
require_once('./data.php');
var_dump($members);
?>
<!-- 省略 -->

var_dumpで$members変数が取得できているか確認してください。

次に、以下のように書いてみてください。

sample/index.php
<?php
require_once('./data.php');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <?php if (isset($members) && is_array($members)) : ?>
            <ul>
                <?php foreach($members as $member) : ?>
                    <li><?php echo $member; ?></li>
                <?php endforeach; ?>
            </ul>
        <?php endif; ?>
    </div>
</body>
</html>

まずはif文の解説をします。

isset()は、変数が定義されているかを確認する関数です。is_array()は、引数が配列かどうかチェックする関数です。

もし$membersが定義されていなかったり、配列ではなかった場合、その後のコードでエラーが出ます。それを防ぐためのチェックです。

存在チェックや型のチェックを心がけておくと、予期せぬエラーを未然に防ぐことができます。

if () :という書き方ができる点は以前説明しました。

上記のコードは以下のように書くこともできますが、

<?php if (isset($members) && is_array($members)) { ?>
    <ul>
        <?php foreach ($members as $member) { ?>
            <li><?php echo $member; ?></li>
        <?php } ?>
    </ul>
<?php } ?>

}が増えてくると見通しが悪くなります。終わりがendifやendforeachの方が明確で分かりかと思います。

$members変数が存在しており、かつ配列であればリストを表示します。

<?php foreach ($members as $member) : ?>
    <li><?php echo $member; ?></li>
<?php endforeach; ?>

foreachも、コロン(:)を使った書き方ができます。

$members配列の各要素が$member変数に代入され、それをli要素の中で表示させています。

関数でHTMLを表示させる

HTMLが長くなると、PHPのコードも増え、見通しが悪くなります。

解決策として、

  • パーツごとにファイルを分割する
  • 関数でHTMLを出力する

という2パターンがありますが、ここでは関数でHTMLを出力する方法を解説します。

lib.php(libはライブラリの略)というファイルを、同じディレクトリに作成してください。

sample/lib.php
<?php

function get_members($members) {
?>
    <?php if (isset($members) && is_array($members)) : ?>
        <ul>
            <?php foreach ($members as $member) : ?>
                <li><?php echo $member; ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif; ?>
<?php
}

get_members関数を作成して、その中にHTMLを出力するコードを書きました。

sample/index.php
<?php
require_once('./data.php');
require_once('./lib.php');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <?php get_members($members); ?>
    </div>
</body>
</html>

index.phpでlib.phpを読み込み、get_members関数を実行しています。

これで先ほどと同様にメンバー一覧のリストが表示されました。

ちなみに、以下のコードはどちらもほぼ同じことをしています(インデントや改行が入るという点では異なります)。

function get_html() {
?>
    <p>テキスト</p>
<?php
}
function get_html() {
    echo '<p>テキスト</p>';
}

前者の方が見通しがよく、実際のHTMLと同じように書けるので楽です。

定数を使う

$members変数は、再代入ができる状態で、中身が書き換えられてしまう可能性があります。

書き換えて欲しくないデータの場合は、定数を使います。

sample/data.php
<?php

$members = array(
    '田中', '鈴木', '佐藤'
);

define('MEMBERS_DATA', $members);

define関数で定数を定義できます。第一引数に定数名、第二引数に定数に入る値を記述します。

一目で定数だと分かるように、全て大文字で命名するのが慣習になっています。

定数は値を書き換えたり、再度同じ名前で定義することはできません。

sample/index.php
<?php
require_once('./data.php');
require_once('./lib.php');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <?php get_members(MEMBERS_DATA); ?>
    </div>
</body>
</html>