Решил попрактиковаться в написании сайта на ООП. Столкнулся с проблемой что в функцию не передаеться результат, полученный из базы. PHP: <?php class News{ public $table = "news"; public $on_page = 5; function get_values() { $this->result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc"); return $this->result; } function get_values_limit() { $this->result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc LIMIT $this->begin, $this->on_page"); return $this->result; } function get_value() { $this->result = mysql_query ("SELECT * FROM $this->table WHERE id = '$this->id' LIMIT 1"); return $this->result; } function generate_values() { while ($info = mysql_fetch_array($this->result)) { if (strlen($info[2]) > 300) { $info[2] = substr($info[2], 0, 300); $info[2] .= "... <a href='?task=news&id=$info[0]' class='news_links'>подробнее</a>"; } $content = "<table align='center' class='news'> <tr> <td class='top_news_corners'> </td> </tr> <tr> <td class='news_text'><b>$info[1]</b><br />$info[2]</td> </tr> <tr> <td class='bottom_news_corners'> </td> </tr> </table><br />"; } return $content; } } ?> Далее обработчик: PHP: <?php $N = new News(); if(isset($_GET['id'])) { $N->id = Validate::protection($_GET['id'], 10, TRUE, TRUE); } else { $N->id = 1; } if(isset($_GET['page'])) { $page = Validate::protection($_GET['id'], 10, TRUE, TRUE); } else { $page = 1; } $N->rows = mysql_num_rows($N->get_values()); if(!isset($_GET['id'])) { if ($N->rows != 0) { $N->url = "?task=news"; $N->begin = ($page - 1) * $N->on_page; $N->num_pages = ceil($N->rows/$N->on_page); $N->get_values_limit(); echo $N->generate_values(); echo Validate::paginator($page, $N->num_pages, $N->url); } } else { if (mysql_num_rows($N->get_value()) != 0) { echo $N->generate_value(); } } ?> Проблема кроется где то тут: $N->get_values_limit(); echo $N->generate_values(); Подскажите, что не так. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\ranetky\www\engine\class\news.php on line 32. Если это что то даст) Обсуждать сам стиль написания кода не желательно))
А где объявление $result? Это же класс, в котором не должно быть таким конструкций, как $this->undefined_variable Объявите нормально эту переменную и в неё из методов уже записывайте, иначе перехватывайте __get и __set и заносите в массив элементов там.
PHP: <? // -------------- public function GetSomething() { $sql = "SELECT `field` FROM ${this->table}"; if(($query = mysql_query($sql))) return $query; else throw new Exception('Query was failed'); } .... try { Class->GetSomething(); } catch(Exception $e) { echo $e->GetMessage(); } Вот концепция ООП Главное - НИКАКИХ УБИЙСТВ внутри класса.
ну, Exceptionы никакого отношения к ооп, говорят, не имеют... Но то, что в первом посте - явно не ооп.
Про РНР я бы так не сказал. Механизм исключений существует в РНР со времен развития принципа (РНР 5, про 4 промолчу) ООП. Что касается С++, то там они КУДА полезней, и в РНР использую лично я их только ради того, чтобы как-то приблизить код к реальной абстракции, которая и является правилом ООП. Представление данных в качестве ОБЪЕКТОВ.
[/quote] Да нормальный код) Я не стремлюсь же к ооп идеалу, а просто хоть чуть чуть приблизиться) я думаю мне удалось)
Он может быть десять раз нормальным, но это не ООП ниразу. Оттого что ты понапихал процедуры в обьект твой код не стал обьектно спроектированным. ЗЫ. Про эксепшны: я при всей их интересности и крутости пользую стары добрый trigger_error(), что в принципе, равнозначно тому использованию эксепшеннов, что продемонстрированно здесь, да впрочем, и повсеместно. Ибо код, перехватывающий исключения внутри обьекта глобального уровня Exception нихрена не задействуют механизм собственно, всплывания исключений, а тупо юзает их синтаксис.
Только давайте сначала разберемся с проблемой. Вот переписал немного обработчик: PHP: <?php if (!defined("security")) die (/*"Доступ закрыт!"*/); $N = new News(); if(isset($_GET['id'])) { $N->id = Validate::protection($_GET['id'], 10, TRUE, TRUE); } else { $N->id = 1; } if(isset($_GET['page'])) { $page = Validate::protection($_GET['id'], 10, TRUE, TRUE); } else { $page = 1; } if(!isset($_GET['id'])) { $news = $N->get_values(); if (mysql_num_rows($news) != 0) { $news = $N->get_values_limit(); $N->url = "?task=news"; $N->begin = ($page - 1) * $N->on_page; $N->num_pages = ceil($N->rows/$N->on_page); $N->result = $news; //$N->get_values_limit(); echo $N->generate_values(); echo Validate::paginator($page, $N->num_pages, $N->url); } } else { if (mysql_num_rows($N->get_value()) != 0) { echo $N->generate_value(); } } ?> Класс: PHP: <?php if (!defined("security")) die (/*"Доступ закрыт!"*/); class News{ public $table = "news"; public $on_page = 5; function get_values() { $result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc"); return $result; } function get_values_limit() { $result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc LIMIT $this->begin, $this->on_page"); return $result; } function get_value() { $tresult = mysql_query ("SELECT * FROM $this->table WHERE id = '$this->id' LIMIT 1"); return $result; } function generate_values() { while ($info = mysql_fetch_array($this->result)) { if (strlen($info[2]) > 300) { $info[2] = substr($info[2], 0, 300); $info[2] .= "... <a href='?task=news&id=$info[0]' class='news_links'>подробнее</a>"; } $content = "<table align='center' class='news'> <tr> <td class='top_news_corners'> </td> </tr> <tr> <td class='news_text'><b>$info[1]</b><br />$info[2]</td> </tr> <tr> <td class='bottom_news_corners'> </td> </tr> </table><br />"; } return $content; } function generate_value() { while ($info = mysql_fetch_array($this->result)) { $content = "<table align='center' class='news'> <tr> <td class='top_news_corners'> </td> </tr> <tr> <td class='news_text'><b>$info[1]</b><br />$info[2]</td> </tr> <tr> <td class='bottom_news_corners'> </td> </tr> </table>"; } return $content; } } ?> Проблема осталась..
Посоветуйте, пожалуйста, материал (статьи или книги), где наиболее доступно описывается ООП в php. Тема для новичка непростая. Сложный материал переваривать труднее.
на твои таланты тут никто не посягает. лично меня конкрретно данная тема заинтересовала для общего развития. я хочу узнать основы использования классов (а не ООП - целиком и сразу) и просил дать интересные ссылки. безусловно, это можно сделать самому. вопрос времени. то, что новичку надо начинать с процедур, ежу понятно. не надо америку открывать.