За последние 24 часа нас посетили 26507 программистов и 1511 роботов. Сейчас ищут 843 программиста ...

Первый опыт в ООП

Тема в разделе "Прочее", создана пользователем WildZero, 13 сен 2010.

  1. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Тут такое дело. Первый раз попробывал написать что то используя ООП. И хотел бы показать вам, что б указали на явные ошибки. А то изучать ООП надо, а без практики очень сложно.

    Суть скрипта следуящая. Есть он лайн игрушка.В ней логгируются прошедшие бои, с указание кто куда бил. Дак вот с помощью скрипта собираю данные об ударах, и в результате предоставляю процентное соотношение ударов.

    Если не сложно в столь праздничный день, покритикуйте :)

    class.php
    PHP:
    1. <?php
    2. class Analizator
    3. {
    4. private $data;
    5. private $hit_head = 0;
    6. private $hit_chest = 0;
    7. private $hit_belt = 0;
    8. private $hit_leg = 0;
    9. public $kol=0;
    10. public $out=Array();
    11. public $login;
    12. public $head_percent;
    13. public $chest_percent;
    14. public $belt_percent;
    15. public $leg_percent;
    16.    
    17.     function login()
    18.     {
    19.         $url = "http://***.com/enter.php";
    20.         $ch = curl_init();
    21.         curl_setopt($ch, CURLOPT_URL, $url);
    22.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    23.         curl_setopt($ch, CURLOPT_HEADER, 0);
    24.         curl_setopt($ch, CURLOPT_TIMEOUT, 7);
    25.         curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
    26.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    27.         curl_setopt($ch, CURLOPT_FAILONERROR, true);
    28.         curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
    29.         curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    30.         curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');   
    31.         curl_setopt($ch, CURLOPT_POSTFIELDS, Array("login"=>"login","psw"=>"password"));
    32.         $this->data = curl_exec($ch);
    33.         curl_close($ch);
    34.     }
    35.     function get_links()
    36.     {
    37.         $date = date ("d.m.y",mktime(0, 0, 0, date("m"), date("d")-($this->kol), date("Y")));
    38.         $url = "http://***.com/script.php?logs=".$date."&filter=".$this->login;
    39.         $ch = curl_init();
    40.         curl_setopt($ch, CURLOPT_URL, $url);
    41.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    42.         curl_setopt($ch, CURLOPT_HEADER, 0);
    43.         curl_setopt($ch, CURLOPT_TIMEOUT, 7);
    44.         curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
    45.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    46.         curl_setopt($ch, CURLOPT_FAILONERROR, true);
    47.         curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
    48.         curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    49.         curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');   
    50.         $this->data = curl_exec($ch);
    51.         preg_match_all ("/logs.php\?log=[0-9]*/",$this->data,$logs,PREG_SET_ORDER);
    52.         curl_close($ch);
    53.         $this->out=array_merge($logs,$this->out);
    54.         $this->kol++;
    55.     }
    56.     function get_stats()
    57.     {
    58.         $count = count($this->out);
    59.         for ($i=0;$i<$count;$i++)
    60.         {
    61.             $number_log = str_replace ("logs.php?log=","",$this->out[$i]);
    62.             $data = file_get_contents("http://***.com/logs.php?&log=".$number_log[0]."&stat=1");
    63.             $data_position = strripos ($data,"<span class=B1>".$this->login."</span>");
    64.             if ($data_position===false)
    65.                 $data_position = strripos ($data,"<span class=B2>".$this->login."</span>");
    66.             $login_length = strlen($this->login);
    67.             $this->hit_head += (int)$data[($data_position+26+$login_length)];
    68.             $this->hit_chest+= (int)$data[($data_position+28+$login_length)];
    69.             $this->hit_belt += (int)$data[($data_position+30+$login_length)];
    70.             $this->hit_leg+= (int)$data[($data_position+32+$login_length)];        
    71.         }  
    72.     }
    73.     function make_stat ()
    74.     {
    75.         $amount_hits = $this->hit_head + $this->hit_chest + $this->hit_belt + $this->hit_leg;
    76.         $this->head_percent = $this->hit_head*100/$amount_hits;
    77.         $this->chest_percent = $this->hit_chest*100/$amount_hits;
    78.         $this->belt_percent = $this->hit_belt*100/$amount_hits;
    79.         $this->leg_percent = $this->hit_leg*100/$amount_hits;
    80.     }
    81. }
    82. ?>
    analizator.php
    PHP:
    1.  
    2. <?php
    3. if (isset($_GET['login']) AND $_GET['login']!='')
    4. {
    5. include ('class.php');
    6. $analizator = new Analizator;
    7. $analizator->login=$_GET['login'];
    8. $analizator->login();
    9. while (count($analizator->out)<10 OR $analizator->kol < 1)
    10. {
    11. $analizator->get_links();
    12. }
    13. $analizator->get_stats();
    14. $analizator->make_stat();
    15. ?>
    16. <table>
    17. <tr>
    18. <td>Ударов в голову</td><td><?=round($analizator->head_percent);?></td>
    19. </tr>
    20. <tr>
    21. <td>Ударов в грудь</td><td><?=round($analizator->chest_percent);?></td>
    22. </tr>
    23. <tr>
    24. <td>Ударов в пояс</td><td><?=round($analizator->belt_percent);?></td>
    25. </tr>
    26. <tr>
    27. <td>Ударов в ноги</td><td><?=round($analizator->leg_percent);?></td>
    28. </tr>
    29. <tr><td>Было проанализировано <?=count($analizator->out);?> боёв за последние <?=$analizator->kol;?> дня</td></tr>
    30. <?}
    31. else
    32. {?>
    33. <form action="analizator.php" method="GET">
    34. Введите логин:<input type="text" name="login"/>
    35. <br>
    36. <input type="submit" value="Анализировать"/>
    37. </form>
    38.  
    39. <?}
    40. ?>
    41.  
     
  2. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Мне сложно и я уже пью пиво :)

    Но одно замечание сделал бы -
    Я бы объявлял "уровень" доступа к методам.
    public \ protected \ private

    Пример можно посмотреть здесь, на скорую руку http://phpworld.ru/php5/php5access.php
     
  3. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    admyx
    Спасибо, усвоил. Приятного пивопития.
     
  4. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    без __construct, __destruct и прочих?
     
  5. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Вот по поводу __construct мне ещё понятно, а вот назначение __destruct нет. И очень ли это критично?
     
  6. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Благодарю, поручик :)

    А вот это я не вкурил
    PHP:
    1. <?php
    2. while (count($analizator->out)<10 OR $analizator->kol < 1)
    3. {
    4.  $analizator->get_links(); //wtf o_0
    5. }
     
  7. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Собирается массив ссылок на статистику боёв. Не больше 10 боёв, либо не больше чем за 2 дня.
     
  8. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    не критично. просто дополнительные возможности в виде реакций на события
     
  9. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Ок. постараюсь всё же понять __destruct. А как вообще логика работы скрипта? не полнейший бред?
     
  10. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    __destruct - это аналог деструктора в комплируемых языках. если нужно выполнить какие-то действия при разрушении объекта (например, сохранить какие-нить данные), то самое место это как-раз таки деструктор. на самом деле, в пхп как-таковых конструкторов и деструкторов нет (не уверен вообще, можно ли принудительно разрушить объект), просто функции, которые вызываются при создании и разрушении.
    в компилируемых языках конструктор занимается выделением памяти под объект, а деструктор - освобождением. ну и конечно выполняет логику, которую добавил программер.
     
  11. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Т.е. получается основная функция - высвобождение памяти?
     
  12. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    для первого раза неплохо)
    в правильном направлении идешь.
     
  13. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    это в компилируемых языках. в пхп это неактуально, ибо интерпретатор сам занимается управлением памяти.
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  15. WildZero

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

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Нее... туда мне ещё рановато, но в закладки кину. Когда-нибудь дорасту :)
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    WildZero
    да это я к тому, что иногда __destruct все таки нужен
     
  17. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Деструктор проще всего показать на примерах
    1
    PHP:
    1. <?php
    2. class a {
    3.      function __destruct() {
    4.           echo 'Preved!';
    5.      }
    6. }
    7. new a; //деструктор выполнится, т.к. экземпляр сразу уничтожится
    2
    PHP:
    1. <?php
    2. class a {
    3.      function __destruct() {
    4.           echo 'Preved!';
    5.      }
    6. }
    7. $a = new a;
    8. echo 'Medved ';
    9. /* деструктор выполнится при завершении работы скрипта */
    еще деструктор выполнится при unset переменной $a или при присвоении ей другого значения.

    Деструктор можно использовать для ведения лога. Создаем экземпляр класса лога, пишем в него, а деструктор пишет уже в файл. Правда, удобнее использовать register_shutdown_function, чтобы лог записался даже если возникает фатальная ошибка.
     
  18. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я бы завернул доступ ко всем переменным в методы, что б не повадно было, да и рука что б набивалась.
     
  19. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    т.е. такой подход кошерный? а если нужно перед применением метода изменить значение одной переменной из ста?
     
  20. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ensiferum
    PHP:
    1. <?php
    2. public function __set($var, $val){
    3.     $method="set".ucfirst($var);
    4.     if (method_exists($this, $method)){
    5.         $this->$method($val);
    6.     }else{
    7.         $this->$var=$val;
    8.     }
    9. }
     
  21. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    блин, во! _construct, __destrucs, __set, __get, чё ещё есть?
     
  22. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  23. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  24. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    хуевый тогда архитектор.

    я понимаю, что написать

    $a->b = 1 быстрее

    но $a->setB(1) правильнее

    ибо понятно что куда + контроль параметров + куча всего того, что в больших проектах просто как воздух, а в маленьких можно и насрать.
     
  25. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Напомнило топик