За последние 24 часа нас посетили 30540 программистов и 1802 робота. Сейчас ищут 845 программистов ...

Мой ООП практикум

Тема в разделе "PHP для новичков", создана пользователем Andrey5555, 4 июн 2009.

  1. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Решил попрактиковаться в написании сайта на ООП.

    Столкнулся с проблемой что в функцию не передаеться результат, полученный из базы.

    PHP:
    1.  
    2. <?php
    3.  
    4. class News{
    5.  
    6. public $table = "news";
    7. public $on_page = 5;
    8.  
    9. function get_values()
    10. {
    11. $this->result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc");
    12. return $this->result;
    13. }
    14.  
    15. function get_values_limit()
    16. {
    17. $this->result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc LIMIT $this->begin, $this->on_page");
    18. return $this->result;
    19. }
    20.  
    21. function get_value()
    22. {
    23. $this->result = mysql_query ("SELECT * FROM $this->table WHERE id = '$this->id' LIMIT 1");
    24. return $this->result;
    25. }
    26.  
    27.  
    28.  
    29.  
    30. function generate_values()
    31. {
    32. while ($info = mysql_fetch_array($this->result))
    33. {
    34. if (strlen($info[2]) > 300)
    35. {
    36. $info[2] = substr($info[2], 0, 300);
    37. $info[2] .= "... <a href='?task=news&id=$info[0]' class='news_links'>подробнее</a>";
    38. }
    39. $content = "<table align='center' class='news'>
    40.  <tr>
    41.    <td class='top_news_corners'>&nbsp;</td>
    42.  </tr>
    43.  <tr>
    44.    <td class='news_text'><b>$info[1]</b><br />$info[2]</td>
    45.  </tr>
    46.  <tr>
    47.    <td class='bottom_news_corners'>&nbsp;</td>
    48.  </tr>
    49. </table><br />";
    50. }
    51.  
    52. return $content;
    53. }
    54.  
    55.  
    56. }
    57. ?>

    Далее обработчик:

    PHP:
    1.  
    2. <?php
    3.  
    4. $N = new News();
    5.  
    6. if(isset($_GET['id']))
    7. {
    8. $N->id = Validate::protection($_GET['id'], 10, TRUE, TRUE);
    9. }
    10. else
    11. {
    12. $N->id = 1;
    13. }
    14. if(isset($_GET['page']))
    15. {
    16. $page = Validate::protection($_GET['id'], 10, TRUE, TRUE);
    17. }
    18. else
    19. {
    20. $page = 1;
    21. }
    22.  
    23. $N->rows = mysql_num_rows($N->get_values());
    24.  
    25. if(!isset($_GET['id']))
    26. {
    27. if ($N->rows != 0)
    28. {
    29. $N->url = "?task=news";
    30.    
    31. $N->begin = ($page - 1) * $N->on_page;
    32. $N->num_pages = ceil($N->rows/$N->on_page);
    33.  
    34. $N->get_values_limit();
    35.    
    36. echo $N->generate_values();
    37. echo Validate::paginator($page, $N->num_pages, $N->url);
    38. }
    39. }
    40. else
    41. {
    42. if (mysql_num_rows($N->get_value()) != 0)
    43. {
    44. echo $N->generate_value();
    45. }
    46.  
    47. }
    48.  
    49. ?>
    Проблема кроется где то тут:
    $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. Если это что то даст)

    Обсуждать сам стиль написания кода не желательно))
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А где объявление $result?
    Это же класс, в котором не должно быть таким конструкций, как $this->undefined_variable
    Объявите нормально эту переменную и в неё из методов уже записывайте, иначе перехватывайте __get и __set и заносите в массив элементов там.
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    $this->result = mysql_query ("
    return $this->result;

    вообще надо заменить на

    return mysql_query ("
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?
    2.  
    3. // --------------
    4. public function GetSomething()
    5. {
    6.     $sql = "SELECT `field` FROM ${this->table}";
    7.  
    8.     if(($query = mysql_query($sql)))
    9.         return $query;
    10.     else
    11.         throw new Exception('Query was failed');
    12. }
    13.  
    14. ....
    15. try
    16. {
    17.     Class->GetSomething();
    18. }
    19. catch(Exception $e)
    20. {
    21.     echo $e->GetMessage();
    22. }
    Вот концепция ООП

    Главное - НИКАКИХ УБИЙСТВ внутри класса.
     
  5. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ну, Exceptionы никакого отношения к ооп, говорят, не имеют... ;)
    Но то, что в первом посте - явно не ооп.
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Про РНР я бы так не сказал.
    Механизм исключений существует в РНР со времен развития принципа (РНР 5, про 4 промолчу) ООП.
    Что касается С++, то там они КУДА полезней, и в РНР использую лично я их только ради того, чтобы как-то приблизить код к реальной абстракции, которая и является правилом ООП. Представление данных в качестве ОБЪЕКТОВ.

    :)
     
  7. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    :)[/quote]

    Да нормальный код) Я не стремлюсь же к ооп идеалу, а просто хоть чуть чуть приблизиться) я думаю мне удалось)
     
  8. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    О. А сможете выразить код который в первом посте в вашем коде?)
     
  9. Он может быть десять раз нормальным, но это не ООП ниразу. Оттого что ты понапихал процедуры в обьект твой код не стал обьектно спроектированным.

    ЗЫ. Про эксепшны: я при всей их интересности и крутости пользую стары добрый trigger_error(), что в принципе, равнозначно тому использованию эксепшеннов, что продемонстрированно здесь, да впрочем, и повсеместно. Ибо код, перехватывающий исключения внутри обьекта глобального уровня Exception нихрена не задействуют механизм собственно, всплывания исключений, а тупо юзает их синтаксис.
     
  10. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    А как же он должен выглядеть, что бы был ооп?

    На даном примере например.
     
  11. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Только давайте сначала разберемся с проблемой. Вот переписал немного обработчик:

    PHP:
    1.  
    2. <?php
    3. if (!defined("security")) die (/*"Доступ закрыт!"*/);
    4.  
    5. $N = new News();
    6.  
    7. if(isset($_GET['id']))
    8. {
    9. $N->id = Validate::protection($_GET['id'], 10, TRUE, TRUE);
    10. }
    11. else
    12. {
    13. $N->id = 1;
    14. }
    15. if(isset($_GET['page']))
    16. {
    17. $page = Validate::protection($_GET['id'], 10, TRUE, TRUE);
    18. }
    19. else
    20. {
    21. $page = 1;
    22. }
    23.  
    24. if(!isset($_GET['id']))
    25. {
    26. $news = $N->get_values();
    27.  
    28. if (mysql_num_rows($news) != 0)
    29. {
    30. $news = $N->get_values_limit();
    31.  
    32. $N->url = "?task=news";
    33.    
    34. $N->begin = ($page - 1) * $N->on_page;
    35. $N->num_pages = ceil($N->rows/$N->on_page);
    36.  
    37. $N->result = $news;
    38.  
    39. //$N->get_values_limit();
    40.    
    41. echo $N->generate_values();
    42. echo Validate::paginator($page, $N->num_pages, $N->url);
    43. }
    44. }
    45. else
    46. {
    47. if (mysql_num_rows($N->get_value()) != 0)
    48. {
    49. echo $N->generate_value();
    50. }
    51.  
    52. }
    53.  
    54. ?>
    Класс:

    PHP:
    1.  
    2. <?php
    3. if (!defined("security")) die (/*"Доступ закрыт!"*/);
    4.  
    5. class News{
    6.  
    7. public $table = "news";
    8. public $on_page = 5;
    9.  
    10. function get_values()
    11. {
    12. $result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc");
    13. return $result;
    14. }
    15.  
    16. function get_values_limit()
    17. {
    18. $result = mysql_query ("SELECT * FROM $this->table ORDER BY id desc LIMIT $this->begin, $this->on_page");
    19. return $result;
    20. }
    21.  
    22. function get_value()
    23. {
    24. $tresult = mysql_query ("SELECT * FROM $this->table WHERE id = '$this->id' LIMIT 1");
    25. return $result;
    26. }
    27.  
    28.  
    29.  
    30.  
    31. function generate_values()
    32. {
    33. while ($info = mysql_fetch_array($this->result))
    34. {
    35. if (strlen($info[2]) > 300)
    36. {
    37. $info[2] = substr($info[2], 0, 300);
    38. $info[2] .= "... <a href='?task=news&id=$info[0]' class='news_links'>подробнее</a>";
    39. }
    40. $content = "<table align='center' class='news'>
    41.  <tr>
    42.    <td class='top_news_corners'>&nbsp;</td>
    43.  </tr>
    44.  <tr>
    45.    <td class='news_text'><b>$info[1]</b><br />$info[2]</td>
    46.  </tr>
    47.  <tr>
    48.    <td class='bottom_news_corners'>&nbsp;</td>
    49.  </tr>
    50. </table><br />";
    51. }
    52.  
    53. return $content;
    54. }
    55.  
    56. function generate_value()
    57. {
    58. while ($info = mysql_fetch_array($this->result))
    59. {
    60. $content = "<table align='center' class='news'>
    61.  <tr>
    62.    <td class='top_news_corners'>&nbsp;</td>
    63.  </tr>
    64.  <tr>
    65.    <td class='news_text'><b>$info[1]</b><br />$info[2]</td>
    66.  </tr>
    67.  <tr>
    68.    <td class='bottom_news_corners'>&nbsp;</td>
    69.  </tr>
    70. </table>";
    71. }
    72. return $content;
    73. }
    74.  
    75. }
    76. ?>
    Проблема осталась..
     
  12. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    Посоветуйте, пожалуйста, материал (статьи или книги), где наиболее доступно описывается ООП в php.
    Тема для новичка непростая. Сложный материал переваривать труднее.
     
  13. Тебе не нужен ООП. Ты еще процедурно нормально программировать не умеешь, а уже в ООП лезешь.
     
  14. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Ну тогда мне посоветуйте)

    И с проблемкой помогите разобраться)
     
  15. kostyl

    kostyl Guest

    Andrey5555
    Читай больше проф литературы...На сайте есть топик.
     
  16. По ООП читать Гради Буча.
     
  17. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    уместнее было бы промолчать, а не писать кто что умеет.
     
  18. «Свою бездарность осознавший, талантам долго будет мстить.»
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Для начала, научись форматировать код.

    Upd. Читать ващще неудобно - не понятно, где что кончается =)
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мне вполне хватает trigger_error + set_error_handle
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Exeption рулит, триггеры сакс! :D
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    неа
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    *exception ;-)

    Upd. А де холивар? :-[
     
  24. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    на твои таланты тут никто не посягает.
    лично меня конкрретно данная тема заинтересовала для общего развития. я хочу узнать основы использования классов (а не ООП - целиком и сразу) и просил дать интересные ссылки. безусловно, это можно сделать самому. вопрос времени.
    то, что новичку надо начинать с процедур, ежу понятно. не надо америку открывать.
     
  25. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва