php講座 クラスの巻 PDF版で見る
今日はphpの関数を作ってみましょう。
関数とは?phpの関数は、教科書ではファンクションと読んでいました。
教科書でやったのは、htmlspecialchars()を簡単に記述するためにファンクションでh()でした。これは、DOCTYPEの前に記述しました。
<?php function h($value) { return htmlspecialchars($value, ENT_QUOTES,’UTF-8’); } ?> <!DOCTYPE html>
関数は、functionで宣言します。しかし、宣言しただけでは、実行されません。かならず、それをコールする部分が必要です。
1箇所からだけでなく、何箇所からコールされても、動きます。ですから、よく使う関数はまとめておくと、あとから使用するときに便利になります。
では、phpにない機能を関数として作ってみましょう。
では、「西暦を和暦に変換する」関数を計画します。
データベースを使っては、面倒になりますので、あらかじめ切り替わりの日をまず覚えておきましょう。
明治:1868年1月25日
大正:1912年7月30日
昭和:1926年12月25日
平成:1989年1月8日
これらが、切り替わりの日付になります。日付は、unix時間に変換して計算する方法がありますが、もっと単純に日付を8桁の整数として扱う方法があります。
例えば、2014年2月4日を20140204とするやり方です。こうすると、比較をする時などは簡単になります。
まず、この方法を考えてみましょう。
今日の日付を年、月、日で取得して、それをsprintfで組み立てるとすると
$year = date('Y'); $month= date('n'); $day = date('j'); echo '<p>西暦:'.$year.'/'.$month.'/'.$day.'</p>'; $date = (int) sprintf('%04d%02d%02d',$year,$month,$day);
sprintfの桁数固定の変換で月が2でも%02dに変換すると、02と、4日の4は%02dで04となります。それを(int)でキャストすると、整数の$dateにすることができます。
では、これを使って、今日の日付を取得して、西暦と整数を表示するプログラムを組んでみましょう。
sample1.php
<body>
<?php
$year = date('Y');
$month= date('n');
$day = date('j');
echo '<p>西暦:'.$year.'/'.$month.'/'.$day.'</p>';
$date = (int) sprintf('%04d%02d%02d',$year,$month,$day);
echo '<p>整数にしたら:'.$date.'</p>';
?>
これができたら、この機能を関数にしてみましょう。
関数名は最終的に和暦にするので、toWareki()にしましょう。
sample2.php
<?php function toWareki($y,$m,$d) { $date = (int) sprintf('%04d%02d%02d',$y,$m,$d); return $date; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php $year = date('Y'); $month= date('n'); $day = date('j'); echo '<p>西暦:'.$year.'/'.$month.'/'.$day.'</p>'; echo '<p>整数にする:'.toWareki($year,$month,$day).'</p>'; ?> </body> </html>
returnで返すと、それをコール元で取得できます。そのままechoすれば表示されます。
整数値になれば、あとは簡単です。切り替わりの年数と比較して、和暦に当てはめていきます。
if ($date >= 19890108) { $label = '平成'; $localYear = $y - 1988; } elseif ($date >= 19261225) { $label = '昭和'; $localYear = $y - 1925; }
大きい値から順に割り当てていきます。$locaYearはその和暦の中の年数です。
では、エラーチェックなども入れて作り上げていきましょう。
sample3.php
<?php /* 明治:1868年1月25日 大正:1912年7月30日 昭和:1926年12月25日 平成:1989年1月8日 */ function toWareki($y,$m,$d) { //明治5年以降のみ if (!checkdate($m,$d,$y) || $y < 1873) { return false; } $date = (int) sprintf('%04d%02d%02d',$y,$m,$d); //日付で分割 if ($date >= 19890108) { $label = '平成'; $localYear = $y - 1988; } elseif ($date >= 19261225) { $label = '昭和'; $localYear = $y - 1925; } elseif ($date >= 19120730){ $label = '大正'; $localYear = $y - 1911; } else { $label = '明治'; $localYear = $y - 1868; } //1年は元年 if ($localYear == 1) { $wareki = $label . '元年'; } else { $wareki = $label . $localYear . '年'; } return $wareki . $m. '月' . $d . '日'; } ?> <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>西暦を和暦に変換してみる</title> </head> <body> <?php $year = date('Y'); $month= date('n'); $day = date('j'); echo '<p>西暦:'.$year.'/'.$month.'/'.$day.'</p>'; echo '<p>和暦:'.toWareki($year,$month,$day).'</p>'; ?> </body> </html>
では、今度はこの関数をクラスにしてみましょう。
DOCTYPEの前で宣言するのではなく、ひとつのまとまった機能ごとにクラスを作ります
クラスを作るのは有益な関数を機能としてまとめたいからです。
そこでさきほど作った和暦変換をKoyomiクラスに入れてみましょう。
class Koyomi { public function Koyomi() { date_default_timezone_set('Asia/Tokyo'); } //西暦和暦変換:年、月、日 public function toWareki($y,$m,$d) {
クラスは別ファイルにしておきましょう。
ひと目で分かるように、class.phpの添字を付けます。
クラス名の頭文字は大文字にして、コンストラクタとメソッドを作ります
Javaのクラスと少し違って、publicでも内部参照で$this->を使用します。
では、クラスを宣言します。
Koyomi.class.php
<?php class Koyomi { /* 明治:1868年1月25日 大正:1912年7月30日 昭和:1926年12月25日 平成:1989年1月8日 */ global $MEIJI = 18680125; public $TAISYO = 19120730; public $SYOWA = 19261225; public $HEISEI = 19890108; public function Koyomi() { date_default_timezone_set('Asia/Tokyo'); } //西暦和暦変換:年、月、日 public function toWareki($y,$m,$d) { //明治5年以降のみ if (!checkdate($m,$d,$y) || $y < 1873) { return false; } $date = (int) sprintf('%04d%02d%02d',$y,$m,$d); //日付で分割 if ($date >= $this->HEISEI) { $label = '平成'; $localYear = $y - 1988; } elseif ($date >= $this->SYOWA) { $label = '昭和'; $localYear = $y - 1925; } elseif ($date >= $this->TAISYO){ $label = '大正'; $localYear = $y - 1911; } else { $label = '明治'; $localYear = $y - 1868; } //1年は元年 if ($localYear == 1) { $wareki = $label . '元年'; } else { $wareki = $label . $localYear . '年'; } return $wareki . $m. '月' . $d . '日'; } } ?>
そして、コール元でrequire_onceでクラスソースを読み込んでおきます。
そして、コンストラクタを使って、オビジェクト変数を作ります。
sample4.php
<?php require_once('Koyomi.class.php'); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php $koyomi = new Koyomi(); $year = date('Y'); $month= date('n'); $day = date('j'); echo '<p>西暦:'.$year.'/'.$month.'/'.$day.'</p>'; echo '<p>和暦:'.$koyomi->toWareki($year,$month,$day).'</p>'; ?> </body> </html>
では、時間が余った人は、別のメソッドも作りこんでみましょう。