こんがらがっていた頭の中がすっきりして、なんとなくですがオブジェクト指向がわかってきたような気がします。
オブジェクト指向で大事そうなのは、機構(機能の固まり)を分けること。
データベースへの通信ならそれだけで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中の何処へでも入れ込むことができるようになってます。
「便利だけどこれでいいのか!」という気持ちはありますね。
やっぱり、まだまだ未熟者。


・\PDO::FETCH_ASSOCを使っているところをDataBaseクラスのメソッドにすれば、PDOを使っていることを知らなくてよい
・$blog*** や $html*** もクラスに切り出して振る舞い(is_empty()やrender()など)を持たせるともっとすっきりしそう
コメントありがとうございます!
\PDO::FETCH_ASSOCも隠し、わかりやすくなりました。
(例)
while($Blog = $dataBase->fetch($sql))
{
~
}
empty~とhtmlの出力も調整、わかりにくい原因となりそうなのがいろいろ取れてすっきりしました(^^)
ありがとうございます!