朝活資料

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

では、クラスを宣言します。

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>

では、時間が余った人は、別のメソッドも作りこんでみましょう。