5day
◇ クロージャー ◇
クロージャ―は関数の引数として渡すのが主な使い道。
関数のprintPurchasedの第2引数 callable $extraDataFuncがクロージャ―を受け取る引数。
<?php declare(strict_types=1); ?>
<?php
function printPurchased(array $items, callable $extraDataFunc): void
{
print '<table border="1">';
print '<tr>';
print '<th>購入日</th>';
print '<th>商品名</th>';
print '<th>価格</th>';
print '<th>その他</th>';
print '</tr>';
foreach($items as $item)
{
print '<tr>';
print '<td>' . $item['date']. '</th>';
print '<td>' . $item['name']. '</th>';
print '<td>' . $item['price']. '</th>';
print '<td>' . $extraDataFunc($item) . '</td>';
print '</tr>';
}
print '</table>';
}
// メインルーチン
$items = [
[
'user-id' => 'tanaka-1234',
'date' => '2018-22-21',
'name' => 'ドレスシャツ',
'price' => '2160',
'color' => 'white',
'size' => 'M',
'item-number' => '91025',
'serial' => 'PLG01219',
],
[
'user-id' => 'tanaka-1234',
'date' => '2018-09-05',
'name' => 'キッズパジャマ',
'price' => '1620',
'color' => 'red',
'size' => '110',
'item-number' => '90081',
'serial' => 'ZAQ80124',
],
];
print '<h3>ユーザーのマイページ内の購入履歴</h3>';
// printPurchased($items, function($item)
// {
// return '色 :' . $item['color'] . 'サイズ:' . $item['size'];
// });
// 上のコード簡単にしたもの↓
$extraFunc1 = function($item)
{
return '色 :' . $item['color'] . 'サイズ:' . $item['size'];
};
printPurchased($items, $extraFunc1);
print '<h3>販売事業者専用のマイページ内の購入履歴</h3>';
// printPurchased($items, function($item)
// {
// return 'ユーザーID :' . $item['user-id'] . '商品NO.:' . $item['item-number'];
// });
// 上のコード簡単にしたもの↓
$extraFunc2 = function($item)
{
return 'ユーザーID :' . $item['user-id'] . '商品NO.:' . $item['item-number'];
};
printPurchased($items, $extraFunc2);
2~3だけならifを使う。
<?php declare(strict_types=1); ?>
<?php
// ユーザー向けの その他一覧 定数
define('EXTRA_PRINT_MODE_USER', 1);
// 販売次号者向けの その他一覧 定数
define('EXTRA_PRINT_MODE_VENDOR', 2);
// クロージャ―でなく、整数型の$extraPrintModeを引数として受け取っています。
function printPurchased(array $items, int $extraPrintMode): void
{
print '<table border="1">';
print '<tr>';
print '<th>購入日</th>';
print '<th>商品名</th>';
print '<th>価格</th>';
print '<th>その他</th>';
print '</tr>';
foreach($items as $item)
{
print '<tr>';
print '<td>' . $item['date']. '</th>';
print '<td>' . $item['name']. '</th>';
print '<td>' . $item['price']. '</th>';
$extraData = ''; //内容の初期化
// ここで条件分岐
if($extraPrintMode === EXTRA_PRINT_MODE_USER)
{
$extraData = '色:' . $item['color'] . 'サイズ' . $item['size'];
}
elseif($extraPrintMode === EXTRA_PRINT_MODE_VENDOR)
{
$extraData = '商品' . $item['item-number'] . '製造番号 :' . $item['serial'];
}
print '<td>' . $extraData . '</td>';
print '</tr>';
}
print '</table>';
}
// メインルーチン
$items = [
[
'user-id' => 'tanaka-1234',
'date' => '2018-22-21',
'name' => 'ドレスシャツ',
'price' => '2160',
'color' => 'white',
'size' => 'M',
'item-number' => '91025',
'serial' => 'PLG01219',
],
[
'user-id' => 'tanaka-1234',
'date' => '2018-09-05',
'name' => 'キッズパジャマ',
'price' => '1620',
'color' => 'red',
'size' => '110',
'item-number' => '90081',
'serial' => 'ZAQ80124',
],
];
print 'ユーザー向け購入履歴ページを出力します。';
printPurchased($items, EXTRA_PRINT_MODE_USER);
print 'ユーザー向け購入履歴ページを出力します。';
printPurchased($items, EXTRA_PRINT_MODE_VENDOR);
◇ 共通部品を外部ファイル化し、プログラム間で共有 ◇
→ require, include
関数のページ(読み込まれる)
↗ ↖
ページ1 ページ2
①require → 外部ファイルを読み込み、読み込めなければ中止。
②require_once → 外部ファイルが既に読み込まれていない場合のみ、
requireを実行する。
③include → 外部ファイルを読み込み、読み込めなくても処理を実行する。
④include_once → 外部ファイルが既に読み込まれていない場合のみ、includeを実行する。
functions.php のような関数が定義されたファイルを読み込むときは、おもに require_once を使う。
なぜ include でないのか → 関数が読み込めなければ処理を中止すべきだからです。
なぜ require でないのか → 2重に同じ関数を読み込むとエラーになるからです。
バナー広告、ウェブページのパーツがかかれたHTML → includeを使う。
なぜ include を使うのか 、→ 読み込みに失敗しても処理を中断するほどでないから。
相対パスでなく → 絶対パスで必ず記入する。
絶対パスはながいため → dirname(FILE)で現在のファイルまでを参照する。
include.php
<body>
<!-- ファイルパスからディレクトリ名のみを得る dirname関数 -->
<!-- 現在のファイル場所を参照する ___FILE__定数 -->
<?php require_once dirname(__FILE__) . '/function.php'; ?>
<h3>柳川鯉太郎さん</h3>
<ul>
<li>指名: 柳川</li>
<li>年齢: <?= calcAge(19790401) ?> さい</li>
<li>住まい: 東京</li>
</ul>
?>
</body>
<?php
function calcAge(int $birthday) : int
{
return (int)((date('Ymd') - $birthday) / 10000);
}
◇ PHPコード ◇
PHPの開始コードには気を付ける → スペース改行はいれない。
PHPだけで作られているファイルは終了タグはかかない。予期しないエラーがでる。
====コメント======
PHPの開始コードと終了コードのことはしらなかった。
そんな使用があったとは。。。
dirname()関数か、、、結構使いそう。。
マジック定数もでてきた。。。久々な感じした。。。忘れてきてるかな。。
(int)((date('Ymd') - $birthday) / 10000);みたいな年齢の計算か。。。なるほど。。。
この記事が気に入ったらサポートをしてみませんか?