Дебаггер использует свой собственный файл $this->f по умолчанию 'debug-log.html' его можно изменить задав явно параметр $filename. Код (Text): $d->fp($a,0,'n:\ew\path\myfile.txt'); дебаггер создаёт экземпляр класса $d при подключении модуля. работа с дебагером: - add=0 - создвёт,открывает,закрывает файл - add=1 - добавляет в существующий открытый файл - add=2 - создаёт, новый файл, открывает его - add=3 - закрывает существующий файл Код (Text): //записываем переменные $a, $b, $c в файл $d->fnDebugLog 1) $d->fp($a,2); 2) $d->fp($b); 3) $d->fp($c,3); функции дебаггера продублированы для вывода на экран print только с той разницей что переменные $add, $filename, $p_line, $p_file заменены на $_exit при значении true программа завершает свою работу. Код (Text): p($a); pC($b,'b',true); //и т.д. PHP: <?php /* work with debug: p($a) - print "$a;" pc($a,$capt) - print "caption=$a;" pCap($caption) - print "caption" pv($a[,$b,$c,$d]) - print "a; b; c; d;" pvC($a,$capta[,$b,$captb,$c,$captc,$d,$captd]) - print "captionA=a; captionB=b; captioC=c; captionD=d;" pA($arr) - print "Array count=__" "content of array" pAA($assocArray) - print assoc array pG() - print data $_GET pP() print data $_GET loop pL($a,[$cnt,$condition,$caption,$description,$maxCnt,$_exit,$var]) print $description $caption1=$a1 $var1 $caption2=$a1 $var2 . . (if maxCnt==cnt print "--- end cycle ---") (if !condition not print) */ class Debugger { private function ocFile($add,$filename,$p_line='',$p_file='') { print $add. " "; if ($add==1) print "<br>"; if($filename<>'') { $this->fnDebugLog=$filename; } $s=''; if($p_line<>'')$s.= 'line ' .$p_line. ' '; if($p_file<>'')$s.= 'file ' .$p_file. ' '; if(($add==1)&&($this->f=='')) { $this->f=fopen($this->fnDebugLog,'a'); } if(($add==0)or($add==2)) { $this->f=fopen($this->fnDebugLog,'w'); fwrite($this->f,'Debuger programm execute [' .date("G.i:s d/m/y",time()). '] ' .$this->html_text. $s.$this->html_text.$this->html_text); } elseif( $s<>'' ) fwrite($this->f,$s.$this->html_text); } public $f = ''; // file debug public $fnDebugLog = 'debug-log.txt'; // log file debugera public $html_text = '<br>'; // html file ili textovii public function fpCap($caption,$add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,$caption.$this->html_text.$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fp($a='',$add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); if($a<>'') fwrite($this->f,$a. ';' .$this->html_text); else { fwrite($this->f,'Print all vars:' .$this->html_text); foreach($GLOBALS as $key=>$val) { if(! is_array($val)) fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } } fwrite($this->f,$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpC($a,$caption,$add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,$caption. '= ' .$a. '; ' .$this->html_text.$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpA($arr,$add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,'Array: count= ' .count($arr). ' ' .$this->html_text); for($i=0;$i<count($arr);$i++) { fwrite($this->f,$arr[$i]. '; '); } fwrite($this->f,$this->html_text.$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } function fprArray($var, $title = true, $add=1, $filename='', $p_line='', $p_file='') { $string = '<table border="1">'; if ($title) { $string .= "<tr><td><b>Key</b></td><td><b>Value</b></td></tr>\n"; } if (is_array($var)) { foreach($var as $key => $value) { $string .= "<tr>\n" ; $string .= "<td><b>$key</b></td><td>"; if (is_array($value)) { $string .= Debugger::printArray($value, false); } elseif(gettype($value) == 'object') { $string .= "Object of class " . get_class($value); } else { $string .= "$value" ; } $string .= "</td></tr>\n"; } } $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,$string); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpAA($arr_assoc,$caption='Array',$add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,$caption. ': count= ' .count($arr_assoc). ';' .$this->html_text); if( count($arr_assoc)>0 ) foreach($arr_assoc as $key=>$val) { fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } fwrite($this->f,$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpP($add=1,$filename='',$p_line='', $p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,'POST:'); if( empty($GLOBALS['_POST'])) fwrite($this->f,'is empty.' .$this->html_text); else { foreach($GLOBALS['_POST'] as $key=>$val) { fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } } fwrite($this->f,$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpG($add=1,$filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,'GET:'); if( empty($GLOBALS['_GET'])) fwrite($this->f,'is empty.' .$this->html_text); else foreach($GLOBALS['_GET'] as $key=>$val) { fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } fwrite($this->f,$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } public function fpInpData($add=1, $filename='',$p_line='',$p_file='') { $this->ocFile($add,$filename,$p_line,$p_file); fwrite($this->f,'POST:'); if( empty($GLOBALS['_POST'])) fwrite($this->f,'is empty.' .$this->html_text); else foreach($GLOBALS['_POST'] as $key=>$val) { fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } fwrite($this->f,$this->html_text); fwrite($this->f,'GET:'); if( empty($GLOBALS['_GET'])) fwrite($this->f,'is empty.' .$this->html_text); else foreach($GLOBALS['_GET'] as $key=>$val) { fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text); } fwrite($this->f,$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } // Otladka ciklov public function fpL($a,$cnt=-1,$add=1,$condition=true,$caption='',$description='',$filename='',$p_line='',$p_file='') { if($condition) { $this->ocFile($add,$filename,$p_line,$p_file); if($cnt==0) fwrite($this->f,$description. ' loop variable inspecting:' .$this->html_text); if($cnt>-1) fwrite($this->f,'step: ' .$cnt. ' '); fwrite($this->f,$caption. '= ' .$a. ';' .$this->html_text); if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; } } } } $d = new Debugger(); function prnVar($s) { $num=0; while( $num<strlen($s) ) { if( $s[$i] == '<' ) $s[$i]='<'; if( $s[$i] == '>' ) $s[$i]='>'; // if( $s[$i] == '' ) $s[$i]='&'; } return $s; } function be_print($var='') { $res=gettype($var); if( ($res == 'string')&&($var == '') ) return false; elseif( ($res == 'integer')&&($var == 0) ) $var='0'; return $var; } function pCap($caption,$_exit=false) { print $caption. "<br>"; if( $_exit==true ) exit; } function p($a,$_exit=false) { print $a. ";<br>"; if( $_exit ) exit; } function pv($a,$b='',$c='',$d='') { $s=$a. ';'; if( !((gettype($b) == 'string')&&($b == '')) ) $s.=' ' .$b. ';'; if( !((gettype($c) == 'string')&&($c == '')) ) $s.=' ' .$c. ';'; if( !((gettype($d) == 'string')&&($d == '')) ) $s.=' ' .$d. ';'; print $s ."<br>"; } function pvC($a,$capta='',$b='',$captb='',$c='',$captc='',$d='',$captd='') { if( $capta == '' ) $s = 'var a=' .$a. '; '; else $s = $capta. '=' .$a. '; '; if( !((gettype($b) == 'string')&&($b == '')) ) if( $captb == '' ) $s.= 'var b=' .$b. '; '; else $s.= $captb. '=' .$b. '; '; if( !((gettype($c) == 'string')&&($c == '')) ) if( $captc == '' ) $s.= 'var c=' .$c. '; '; else $s.= $captc. '=' .$c. '; '; if( !((gettype($d) == 'string')&&($d == '')) ) if( $captd == '' ) $s.= 'var d=' .$d. '; '; else $s.= $captd. '=' .$d. '; '; print "$s<br>"; } function pC($a,$caption,$_exit=false) { print $caption. "=" .$a. ";<br>"; if( $_exit ) exit; } function pA($arr,$_exit=false) { print "count = " .count($arr). "<br>"; for($i=0;$i<count($arr);$i++) print $arr[$i]. ";<br>"; print "<br>"; if( $_exit ) exit; } function pAA($arr,$caption='',$_exit=false) { if( $caption=='' ) $caption='Array'; print $caption. ": count = ".count($arr). "<br>"; foreach($arr as $key=>$value) { print "key = " .$key. "; value = " .$value. ";<br>"; } print "<br>"; if( $_exit ) exit; } function pP($_exit=false) { pAA($GLOBALS['_POST'],'POST',$_exit); } function pG($_exit=false) { pAA($GLOBALS['_GET'],'GET',$_exit); } function pInpData($_exit=false) { pAA($GLOBALS['_POST'],'POST',$_exit); pAA($GLOBALS['_GET'],'GET',$_exit); } function pL($a,$cnt=-1,$condition=true,$caption='',$description='',$maxCnt=-1,$_exit=false,$var='') { if( !$condition ) return false; if( ($cnt==0)&&($description<>'') ) print $description. "<br><br>"; if( $cnt<>-1 ) print $cnt. ": "; ($caption=='')?print $a. "; " .$var. ";<br><br>":print $caption. " = " .$a. "; " .$var. ";<br><br>"; if( ($maxCnt<>-1)&&($cnt==$maxCnt) ) { print "--- end cycle ---<br><br>"; if( $_exit ) exit; } } ?> Может кто-то придумает алгоритм и функции удаления вставок дебаггера из файлов проекта? :roll: * в разработке дебаггера принимали участие: Апельсин, Padaboo, Luge, tommyangelo, Volt(220), ну и kadet
kadet Что то, не совсем понимаю, отлаживать чего можно с помощью вами написаного, и как. Вот отладчик вы предложили написать верно? 1.Что он будет уметь делать? и/или что с помощью него можно делать? 2.Какие задачи нужно в нём реализовать? 3.С чем он будет работать? 4.Какая в нём потребность? и/или необходимость? Какие есть альтернативы для решения задач которые будет решать отладчик? P.S. раздел форума "Программирование на PHP для новичков" - почему сюда?
1. 2. 3. .. Сразу видно программер писал "Прг для новичков" потому что недавно сел за пхп. Padaboo, мощная у вас штука,только нельзя просмотреть переменнные, насколько я понял. В этом в принципе вся цель дебуггера. Какие куда пришли данные где искать ошибку. RX, может и есть альтернативы, хочется самому создать чтото полезное. /3.С чем он будет работать?/ с пхп, штмл /в виду того что отображаемую информацию трудно разглядеть в тексте/ раньше выводил значения переменных прямо на страницу print "$a", echo($a) и т.д.
kadet я для "быстрого дебага" использую супер-пупер функцию))) function dg($var = null, $var_dump = false) { echo '<pre>'; $var_dump === false ? print_r($var) : var_dump($var); die(); } Попробуй заюзать))) Принимает в качестве первого параметра любой тип переменной будь то обычная переменная любого типа, массив или объект А это из книги "PHP5 для профессионалов" PHP: <?php define('DEBUG_INFO', 100); define('DEBUG_SQL', 75); define('DEBUG_WARNING', 50); define('DEBUG_ERROR', 25); define('DEBUG_CRITICAL', 10); class Debugger { public static function debug($data, $key = null, $debugLevel = DEBUG_INFO) { global $cfg; if(! isset($_SESSION['debugData'])) { $_SESSION['debugData'] = array(); } if($debugLevel <= $cfg['DEBUG_LEVEL']) { $_SESSION['debugData'][$key] = $data; } } public static function debugPrint() { $arDebugData = $_SESSION['debugData']; print Debugger::printArray($arDebugData); $_SESSION['debugData'] = array(); } function printArray($var, $title = true) { $string = '<table border="1">'; if ($title) { $string .= "<tr><td><b>Key</b></td><td><b>Value</b></td></tr>\n"; } if (is_array($var)) { foreach($var as $key => $value) { $string .= "<tr>\n" ; $string .= "<td><b>$key</b></td><td>"; if (is_array($value)) { $string .= Debugger::printArray($value, false); } elseif(gettype($value) == 'object') { $string .= "Object of class " . get_class($value); } else { $string .= "$value" ; } $string .= "</td></tr>\n"; } } $string .= "</table>\n"; return $string; } } ?> Чтобы отследить переменную Код (Text): Debugger::debug($query, "Класс такой-то, метод такой-то, либо строка"); Перед выпадением программы в аут Код (Text): Debugger::debugPrint();
Нормально работает, но выводить в файл всё равно лучше. Прг может и работать,только в некоторых элементах может быть ошика, потом их вылавлиы ваешь.. как тараканов. Где достать номер строки? Былобы красивее.
Мне вот этого пока хватает. http://code.google.com/p/voltcore/sourc ... r.php?r=50 tommyangelo А идея дебагера там интересна. Одна из немногих интересных идей в этой книге, на мой взгляд.