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>
では、時間が余った人は、別のメソッドも作りこんでみましょう。