クラスの継承を利用して、複数のHTMLを効率的に組む方法をご紹介します。
クラスは継承を行うことにより、その機能を拡張することができます。
継承される側を親クラス、継承する側を子クラスと呼びます。
例えば親クラスParent、子クラスChildとして、次のように継承関係を表現することができます。
<?php
class Parent {}
class Child extends Parent {}
クラスの継承を利用して、HTMLを構築してみましょう。
ページを作成する際にHTMLの記述で共通となる場所が出てきます。これをクラスの継承により親クラスで一括管理する方法を考えます。
次のPageCommonクラスが親クラスで、HTMLの共通部分を管理しています。子クラスのPageクラスではBody、Titleの内部のみについて記述をすることができます。
abstractは「抽象」を意味し、そのクラスやメソッドが子クラスで実装されることを必須とします。 別の言い方をすれば、abstract指定されたものはオブジェクト化されるときには、必ず実装されていることが保障されているということになります。 PageCommonクラスではgetTitleメソッド、getBodyメソッドを利用するしくみは作っておいて、それぞれの実装内容については子クラスに任されることになります。
<?php
/* ページ共通クラス */
abstract class PageCommon
{
/* ページの全HTMLを取得 */
public function getPage()
{
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><?php echo $this->getTitle(); ?></title>
</head>
<body>
<?php $this->getBody(); ?>
</body>
</html>
<?php
}
abstract protected function getTitle(); // タイトル取得用
abstract protected function getBody(); // コンテンツ取得用
}
Pageクラスには親クラスであるPageCommonクラスの機能も受け継がれますので、Pageクラスをオブジェクト化すればgetPageメソッドを呼び出すことができます。
<?php
require_once 'page_common.php';
class Page extends PageCommon
{
/* タイトル指定 */
protected function getTitle()
{
return 'サンプルページ';
}
/* コンテンツ指定 */
protected function getBody()
{
?>
<h1>ページタイトル</h1>
<p>コンテンツ</p>
<?php
}
}
index.phpはPageクラスをオブジェクト化し、getPageメソッドを呼び出してHTMLを生成しています。
<?php require_once 'page.php'; $page = new Page(); $page->getPage();
親クラスに共通部分を管理させることで、子クラスは個別に異なる部分のみを記述していくことができます。これが継承のメリットです。
Webサイトを作る上ではデザインも各ページで共通部分が出てきますので、それらも親クラスとしてまとめることができれば子クラスでコンテンツにのみ集中してコーディングできます。
以上のように、親クラスは全体的な機能、子クラスは個別の機能を持たせてクラスの継承が枝分かれしてゆきます。 親クラスにいくほど機能は抽象的になり(汎化)、子クラスにいくほど、その機能の用途は限られます(特化)。