Тут такое дело. Первый раз попробывал написать что то используя ООП. И хотел бы показать вам, что б указали на явные ошибки. А то изучать ООП надо, а без практики очень сложно. Суть скрипта следуящая. Есть он лайн игрушка.В ней логгируются прошедшие бои, с указание кто куда бил. Дак вот с помощью скрипта собираю данные об ударах, и в результате предоставляю процентное соотношение ударов. Если не сложно в столь праздничный день, покритикуйте class.php PHP: <?php class Analizator { private $data; private $hit_head = 0; private $hit_chest = 0; private $hit_belt = 0; private $hit_leg = 0; public $kol=0; public $out=Array(); public $login; public $head_percent; public $chest_percent; public $belt_percent; public $leg_percent; function login() { $url = "http://***.com/enter.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 7); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); curl_setopt($ch, CURLOPT_POSTFIELDS, Array("login"=>"login","psw"=>"password")); $this->data = curl_exec($ch); curl_close($ch); } function get_links() { $date = date ("d.m.y",mktime(0, 0, 0, date("m"), date("d")-($this->kol), date("Y"))); $url = "http://***.com/script.php?logs=".$date."&filter=".$this->login; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 7); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); $this->data = curl_exec($ch); preg_match_all ("/logs.php\?log=[0-9]*/",$this->data,$logs,PREG_SET_ORDER); curl_close($ch); $this->out=array_merge($logs,$this->out); $this->kol++; } function get_stats() { $count = count($this->out); for ($i=0;$i<$count;$i++) { $number_log = str_replace ("logs.php?log=","",$this->out[$i]); $data = file_get_contents("http://***.com/logs.php?&log=".$number_log[0]."&stat=1"); $data_position = strripos ($data,"<span class=B1>".$this->login."</span>"); if ($data_position===false) $data_position = strripos ($data,"<span class=B2>".$this->login."</span>"); $login_length = strlen($this->login); $this->hit_head += (int)$data[($data_position+26+$login_length)]; $this->hit_chest+= (int)$data[($data_position+28+$login_length)]; $this->hit_belt += (int)$data[($data_position+30+$login_length)]; $this->hit_leg+= (int)$data[($data_position+32+$login_length)]; } } function make_stat () { $amount_hits = $this->hit_head + $this->hit_chest + $this->hit_belt + $this->hit_leg; $this->head_percent = $this->hit_head*100/$amount_hits; $this->chest_percent = $this->hit_chest*100/$amount_hits; $this->belt_percent = $this->hit_belt*100/$amount_hits; $this->leg_percent = $this->hit_leg*100/$amount_hits; } } ?> analizator.php PHP: <?php if (isset($_GET['login']) AND $_GET['login']!='') { include ('class.php'); $analizator = new Analizator; $analizator->login=$_GET['login']; $analizator->login(); while (count($analizator->out)<10 OR $analizator->kol < 1) { $analizator->get_links(); } $analizator->get_stats(); $analizator->make_stat(); ?> <table> <tr> <td>Ударов в голову</td><td><?=round($analizator->head_percent);?></td> </tr> <tr> <td>Ударов в грудь</td><td><?=round($analizator->chest_percent);?></td> </tr> <tr> <td>Ударов в пояс</td><td><?=round($analizator->belt_percent);?></td> </tr> <tr> <td>Ударов в ноги</td><td><?=round($analizator->leg_percent);?></td> </tr> <tr><td>Было проанализировано <?=count($analizator->out);?> боёв за последние <?=$analizator->kol;?> дня</td></tr> <?} else {?> <form action="analizator.php" method="GET"> Введите логин:<input type="text" name="login"/> <br> <input type="submit" value="Анализировать"/> </form> <?} ?>
Мне сложно и я уже пью пиво Но одно замечание сделал бы - Я бы объявлял "уровень" доступа к методам. public \ protected \ private Пример можно посмотреть здесь, на скорую руку http://phpworld.ru/php5/php5access.php
Благодарю, поручик А вот это я не вкурил PHP: <?php while (count($analizator->out)<10 OR $analizator->kol < 1) { $analizator->get_links(); //wtf o_0 }
__destruct - это аналог деструктора в комплируемых языках. если нужно выполнить какие-то действия при разрушении объекта (например, сохранить какие-нить данные), то самое место это как-раз таки деструктор. на самом деле, в пхп как-таковых конструкторов и деструкторов нет (не уверен вообще, можно ли принудительно разрушить объект), просто функции, которые вызываются при создании и разрушении. в компилируемых языках конструктор занимается выделением памяти под объект, а деструктор - освобождением. ну и конечно выполняет логику, которую добавил программер.
это в компилируемых языках. в пхп это неактуально, ибо интерпретатор сам занимается управлением памяти.
Деструктор проще всего показать на примерах 1 PHP: <?php class a { function __destruct() { echo 'Preved!'; } } new a; //деструктор выполнится, т.к. экземпляр сразу уничтожится 2 PHP: <?php class a { function __destruct() { echo 'Preved!'; } } $a = new a; echo 'Medved '; /* деструктор выполнится при завершении работы скрипта */ еще деструктор выполнится при unset переменной $a или при присвоении ей другого значения. Деструктор можно использовать для ведения лога. Создаем экземпляр класса лога, пишем в него, а деструктор пишет уже в файл. Правда, удобнее использовать register_shutdown_function, чтобы лог записался даже если возникает фатальная ошибка.
т.е. такой подход кошерный? а если нужно перед применением метода изменить значение одной переменной из ста?
Ensiferum PHP: <?php public function __set($var, $val){ $method="set".ucfirst($var); if (method_exists($this, $method)){ $this->$method($val); }else{ $this->$var=$val; } }
хуевый тогда архитектор. я понимаю, что написать $a->b = 1 быстрее но $a->setB(1) правильнее ибо понятно что куда + контроль параметров + куча всего того, что в больших проектах просто как воздух, а в маленьких можно и насрать.