見出し画像

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>

function.php

<?php

function calcAge(int $birthday) : int
{
    return (int)((date('Ymd') - $birthday) / 10000);
}

◇ PHPコード ◇


PHPの開始コードには気を付ける → スペース改行はいれない。
PHPだけで作られているファイルは終了タグはかかない。予期しないエラーがでる。



====コメント======

PHPの開始コードと終了コードのことはしらなかった。
そんな使用があったとは。。。
dirname()関数か、、、結構使いそう。。
マジック定数もでてきた。。。久々な感じした。。。忘れてきてるかな。。
 (int)((date('Ymd') - $birthday) / 10000);みたいな年齢の計算か。。。なるほど。。。

この記事が気に入ったらサポートをしてみませんか?