function __construct()
{
$this->mArticle = M_Article::Instance();
$this->mComments = M_Comments::Instance();
}
Класс M_Article является моделью, которая занимается всеми манипуляциями со статьями. Класс M_Comments манипулирует комментариями.
В контроллере есть метод action_article()
<?php
public function action_article()
{
$this->title .= '::Статьи';
$error = ERR_ARTICLE_NOT_FOUND;
if (!empty($_GET))
{
// Извлечение статьи.
$article = $this->mArticle->Get($_GET['id']);
if($article <> NULL)
{
$article['title'] = nl2br($article[0]['title']);
$article['content'] = nl2br($article[0]['content']);
$error = 0;
}
$comments = $this->mComments->Get($_GET['id']);
}
$this->content = $this->Template('v/v_article.php',array('article' => $article, 'error' => $error, 'comments'=>$comments));
$this->fill_left_block('article');
}
?>
по задумке этот метод выводит страницу со статьей, которую выцепляет из базы, за это отвечает M_Article . А под статьей выводятся комментарии к ней - M_Comments.
Проблема такова, что интерпретатор экземпляр класса M_Comments воспринимает как M_Article. И там где вызывается метод GET() класса
$comments = $this->mComments->Get($_GET['id']); интерпретатор берет этот метод из класса M_Article. Фактически он воспринимает так будто M_Comments это M_Article. Специально проверил это через
print_r(M_Comments::Instance()->Get($GET['id'])). Интерпретатор возвращает ассоциативный массив с полями из базы articles, а не comments. Если прописать в конструкторе сначала объявление свойства равным M_Comments. То как ни странно интепретатор будет видеть везде только M_Comments даже там где на самом деле класс M_Article. Вот такой бред. Что сделать чтобы все работало по задумке ? Где ошибка ?
<?php
class M_Article extends M_Bd
{
//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
self::$instance = new M_Article;
}
return self::$instance;
}
//Конструктор
protected function __construct()
{
parent::__construct('articles', 'id_article');
}
//
// Список всех статей или статей на текущей странице
//
function articles_all($page_id = NULL)
{
if($page_id <> NULL)
{
if((int)$page_id <= 0)
return NULL;
$count = ARTICLES_ON_PAGE;
$shift = ($page_id - 1) * $count;
return $this->articles_some($shift,$count);
}
else
return $this->articles_some();
}
//
// Получить $count статей после $shift
//
function articles_some($shift = NULL, $count = NULL)
{
$query = "SELECT *
FROM articles
ORDER BY id_article DESC"; //LIMIT $shift,$count
if($count <> NULL)
$query .= " LIMIT $shift,$count";
$articles = $this->M_MSQL->Select($query);
return $articles;
}
//
// Кол-во страниц статей
//
function get_pages_count()
{
$query = "SELECT COUNT(*)
FROM articles";
$count = $this->M_MSQL->Select($query);
return ceil($count[0]['COUNT(*)'] / ARTICLES_ON_PAGE);
}
//
// Краткое описание статьи
//
function articles_intro($article)
{
$symb_limit = ARTICLE_INTRO_LIMIT;
$result_str = $article['content'];
if(strlen($result_str) > $symb_limit)
{
$result_str = substr($result_str,0,$symb_limit);
$temp_str = explode(' ',$result_str);
unset($temp_str[count($temp_str) - 1]);
$result_str = implode(' ',$temp_str) . '...';
}
return $result_str;
}
}
class M_Comments extends M_Bd
{
//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
self::$instance = new M_Comments;
}
return self::$instance;
}
//Конструктор
protected function __construct()
{
parent::__construct('comments', 'id_article');
}
}
class M_Bd
{
public $table;
public $pk;
protected $M_MSQL;
protected static $instance;
//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
$self::$instance = new M_Bd;
}
return self::$instance;
}
protected function __construct($table, $pk)
{
$this->table = $table;
$this->pk = $pk;
$this->M_MSQL = M_MSQL::Instance();
}
//
// Экранирование потенциально опасных символов
//
function protect_str($str)
{
return htmlspecialchars(mysql_real_escape_string($str));
}
//
//Выборка из базы конкретной статьи или комментариев
//
public function Get($id_article)
{
$t = "SELECT *
FROM $this->table
WHERE $this->pk = '%d'
ORDER BY $this->pk DESC";
$query = sprintf($t, $id_article);
$result = $this->M_MSQL->Select($query);
return $result;
}
//
// Добавить статью
//
public function Add($title, $content)
{
// Подготовка.
$title = trim($title);
$content = trim($content);
// Проверка.
if ($title == '')
return false;
// Запрос.
$obj = array();
$obj['title'] = $title;
$obj['content'] = $content;
$this->msql->Insert($this->table, $obj);
return true;
}
//
// Изменить статью
//
public function Edit($id_article, $title, $content)
{
// Подготовка.
$title = trim($title);
$content = trim($content);
// Проверка.
if ($title == '')
return false;
// Запрос.
$obj = array();
$obj['title'] = $title;
$obj['content'] = $content;
$t = "id_article = '%d'";
$where = sprintf($t, $id_article);
$this->M_MSQL->Update($this->table, $obj, $where);
return true;
}
//
// Удалить статью
//
public function Delete($id_article)
{
// Запрос.
$t = "id_article = '%d'";
$where = sprintf($t, $id_article);
$this->M_MSQL->Delete($this->table, $where);
return true;
}
}
?>