RのWeb制作

Webサービス制作のための技術情報を。

Web制作

[PHP]まとめ読みをPSRで改良する(4)

投稿日:


まとめ読みをPSRで改良する(3)から約一週間。

こんがらがっていた頭の中がすっきりして、なんとなくですがオブジェクト指向がわかってきたような気がします。

オブジェクト指向で大事そうなのは、機構(機能の固まり)を分けること。
データベースへの通信ならそれだけで1つの変数に格納する。

たとえば「$dataBase->….;」という感じで。

これだと名前空間の汚染?が無くなる。自作の関数被りが無くなるって言った方がわかりやすいかな。

そしてPSR規則にのっとりつつ・・・って感じですね。

<?
require_once 'SplClassLoader.php';
require_once 'password.php';
require_once 'Mobile_Detect.php';

// クラスローダー
$classloaderBase = new SplClassLoader('ReiFarms', './lib');
$classloaderBase->register();

// 拡張
$dataBase = new ReiFarms\DataBase();
$config = new ReiFarms\Matomeyomi\Config();
$display = new ReiFarms\Matomeyomi\Display();

// MySql
$dataBase::setInfo($config->dbInfo);

携帯判定(mobile_detect)もそのまま使えました。

// 携帯判定
$detect = new Mobile_Detect;
if(empty($_SESSION['isMobile']))
{
    $_SESSION['isMobile'] = $detect->isMobile() ? true : false;
}

これは便利!

本題のプログラムはこんな感じで書いています。
今のところは問題はなさそう。

<?php
require_once './lib/Matomeyomi.php';

// DataBase
$dataBase->connectDb();

// Html
$html = null;

// 初期設定
$blogAll = [];
$blogWeekCount = [];
$blogAllCount = [];
$htmlArticleWeek = null;
$htmlArticleAll = null;
$htmlBlogWeek = null;
$htmlBlogAll = null;

// 初期読み込み
$sql = $dataBase->query("SELECT * FROM blog");
if($sql){
    while($Blog = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        $blogAll[$Blog['id']] = $Blog;
        $blogWeekCount[$Blog['id']] = $Blog['count'];
        $blogAllCount[$Blog['id']] = $Blog['count_all'];
    }
    
    // 記事ランキング
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count, count_all FROM article ORDER BY count DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count'])
        {
            break;
        }
        // 取得
        if(empty($blogWeekCount[$Article['blogid']]))
        {
            $blogWeekCount[$Article['blogid']] = 0;
        }
        $blogWeekCount[$Article['blogid']] += $Article['count'];
        if(empty($blogAllCount[$Article['blogid']]))
        {
            $blogAllCount[$Article['blogid']] = 0;
        }
        $blogAllCount[$Article['blogid']] += $Article['count_all'];
        // 表示
        if($i < 50)
        {
            if($htmlArticleWeek)
            {
                $htmlArticleWeek .= "<tr><th></th></tr>\n";
            }
            $htmlArticleWeek .= $config->rankArray('Article', $i, $Article['count'], $Article);
            $i++;
        }
    }
    if(!$htmlArticleWeek)
    {
        $htmlArticleWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気記事
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count_all FROM article ORDER BY count_all DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count_all'])
        {
            break;
        }
        // 表示
        if($i < 50)
        {
            if($htmlArticleAll)
            {
                $htmlArticleAll .= "<tr><th></th></tr>\n";
            }
            $htmlArticleAll .= $config->rankArray('Article', $i, $Article['count_all'], $Article);
            $i++;
        }else{
            break;
        }
    }
    if(!$htmlArticleAll)
    {
        $htmlArticleAll = "<tr><th>データがありません</th></tr>\n";
    }
    
    // ブログランキング
    if($blogWeekCount)
    {
        arsort($blogWeekCount);
        $i = 1;
        foreach($blogWeekCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogWeek)
                {
                    $htmlBlogWeek .= "<tr><th></th></tr>\n";
                }
                $htmlBlogWeek .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogWeek)
    {
        $htmlBlogWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気ブログ
    if($blogAllCount)
    {
        arsort($blogAllCount);
        $i = 1;
        foreach($blogAllCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogAll)
                {
                    $htmlBlogAll .= "<tr><th></th></tr>\n";
                }
                $htmlBlogAll .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogAll)
    {
        $htmlBlogAll = "<tr><th>データがありません</th></tr>\n";
    }
}else{
    $htmlArticleWeek = $htmlArticleAll = $htmlBlogWeek = $htmlBlogAll = "登録されていません";
}

$html = $config::readHtml('ranking.html');

// 置き換え
$html = str_replace('${htmlArticleWeek}', $htmlArticleWeek, $html);
$html = str_replace('${htmlArticleAll}', $htmlArticleAll, $html);
$html = str_replace('${htmlBlogWeek}', $htmlBlogWeek, $html);
$html = str_replace('${htmlBlogAll}', $htmlBlogAll, $html);

// Display
$display::setHtml($html);
$display->sub();

// アクセス解析
$config->access();

最後で置き換え。
これでHTML中の何処へでも入れ込むことができるようになってます。
「便利だけどこれでいいのか!」という気持ちはありますね。

やっぱり、まだまだ未熟者。

-Web制作

執筆者:


  1. 匿名 より:

    ・\PDO::FETCH_ASSOCを使っているところをDataBaseクラスのメソッドにすれば、PDOを使っていることを知らなくてよい

    ・$blog*** や $html*** もクラスに切り出して振る舞い(is_empty()やrender()など)を持たせるともっとすっきりしそう

    • Rei より:

      コメントありがとうございます!

      \PDO::FETCH_ASSOCも隠し、わかりやすくなりました。
      (例)
      while($Blog = $dataBase->fetch($sql))
      {

      }

      empty~とhtmlの出力も調整、わかりにくい原因となりそうなのがいろいろ取れてすっきりしました(^^)
      ありがとうございます!

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

PHPでPC・スマホ・タブレット・携帯を判別するおすすめの方法

今まさにスマートフォン時代になってきています。 今月のアクセス解析 PHPでPCやスマートフォン、タブレット、携帯を判別してみましょう。 普通の判別法 $_SERVER[‘HTTP_USER_AGEN …

[Meisyo]強化合成の追加とミニゲーム1種類の追加

名将と呼ばれた者達よりお知らせです。 強化合成を実装しました。 強化合成とは 選手たちの好きな能力を強化します。 強化値は+0~5です。能力値にそのまま反映されます。 +2(+3への)以降の強化は、失 …

[Meisyo]スタミナ減少による球速低下が酷過ぎる件について

最近SQLばっかり書いているRです。早く適正なSQLを書きたいものです…。 とはいえ、ネットで書かれているようなことは一通り理解してできるようになりました。やったぜ。 今回は、タイトルの通り・・・ ス …

no image

iPhoneアプリを開発してみよう

最近ずっとiPhoneアプリで遊んでて、 「なんか頭使うゲームないな?」と思い(”本質的には育成ゲー”が多すぎてゲンナリ) 「複数人でのRTS」があればな~と。 「他ゲーに文句 …

[Meisyo]速球の地位向上

[Meisyo]ビッグデータから学ぶ試合の基礎設計4から早4か月。 「速球の上方修正してほしいな」というコメントが届きました。 すみません! 制球に比べ、速球は蔑ろにされてきたことはわかっております。 …