I am working on some PHP classes that can do some basic profiling, debugging, and error handling. Yes I know about XDebug and it's great, but I would like to have some classes as well for my library to do some of this type of stuff.
Below is a class I am working on that will show an error message when one occurs and will show me the line number it happened on as well as the source code for that line and the X amount of lines below and above the error line. Similar to in this image below... (may have to view image in new window/tab to see larger version)
Here is my class code I have as of right now for this...
<?php
class Debugger
{
public static function debug_source($file, $line_number, $padding = 5)
{
if (!$file or !is_readable($file)) {
return false;
}
// Open the file and set the line position
$file = fopen($file, 'r');
$line = 0;
// Set the reading range
$range = array('start' => $line_number - $padding, 'end' => $line_number + $padding);
// Set the zero-padding amount for line numbers
$format = '% ' . strlen($range['end']) . 'd';
$source = '';
while (($row = fgets($file)) !== false)
{
// Increment the line number
if (++$line > $range['end'])
break;
if ($line >= $range['start']){
// Make the row safe for output
$row = htmlspecialchars($row, ENT_NOQUOTES);
// Trim whitespace and sanitize the row
$row = '<span class="number">' . sprintf($format, $line) . '</span> ' . $row;
if ($line === $line_number){
// Apply highlighting to this row
$row = '<span class="line highlight">' . $row . '</span>';
} else{
$row = '<span class="line">' . $row . '</span>';
}
// Add to the captured source
$source .= $row;
}
}
// Close the file
fclose($file);
echo '<div id="exception_error">';
echo ' <h1><span class="type"> Error [ 345 ]</span></h1>';
echo ' <div class="content">';
echo ' <p>Test error message on line number ' . $line_number. '</p>';
echo ' <p><pre class="source"><code>' . $source . '</code></pre></p>';
echo ' </div>';
echo '</div>';
}
}
// Testing the class above.
$file = 'bitmask/bitmasktest.php';
$line_number = 82;
$line_number_padding = 5;
$debugger = new Debugger();
$debugger->debug_source($file, $line_number, $line_number_padding);
?>
So I am looking for ways to improve and add on to this. It is not complete yet, this is just a start.
A couple of basic questions.
1) Should I declare all variables in a class like this at the top? For example in this class I access the properties like this $file, $line_number, $padding. Should I declare them at the top (all properties) like...
<?php
//public/private/protected
public $this->file;
private $this->$line_number;
private $this->padding;
// etc, etc, for every single property used in a class method
// or should I access them how I currently do in
// this class like $file, $line_number, etcc????
?>
?>
2) To make the output look correct from my method above, it needs this CSS data below in the page, I know I should probably include a CSS file for it or add it to my other css files, but my goal is to have this class be self contained, so the class can be ran anywhere and have the correct output. Should I somehow have a method that outputs the CSS needed for this class or what are some good ideas to keep it self contained and still look the way I want it (like in the image)?
<style type="text/css">
#exception_error {
background: #ddd;
font-size: 1em;
font-family:sans-serif;
text-align: left;
color: #333333;
}
#exception_error h1,
#exception_error h2 {
margin: 0;
padding: 1em;
font-size: 1em;
font-weight: normal;
background: #911911;
color: #FFFFFF;
}
#exception_error h1 a,
#exception_error h2 a {
color: #FFFFFF;
}
#exception_error h2 {
background: #666666;
}
#exception_error h3 {
margin: 0;
padding: 0.4em 0 0;
font-size: 1em;
font-weight: normal;
}
#exception_error p {
margin: 0;
padding: .4em;
}
#exception_error a {
color: #1b323b;
}
#exception_error p {
margin: 0;
padding: 0.1em 0;
}
#exception_error pre.source {
margin: 0 0 1em;
padding: 0.4em;
background: #fff;
border: dotted 1px #b7c680;
line-height: 1.2em;
}
#exception_error pre.source span.line {
display: block;
}
#exception_error pre.source span.highlight {
background: #f0eb96;
}
#exception_error pre.source span.line span.number {
color: #666;
}
</style>
<style type="text/css">
.linenum{
text-align:right;
background:#FDECE1;
border:1px solid #cc6666;
padding:0px 1px 0px 1px;
font-family:Courier New, Courier;
float:left;
width:17px;
margin:3px 0px 30px 0px;
}
code {/* safari/konq hack */
font-family:Courier New, Courier;
}
.linetext{
width:700px;
text-align:left;
background:white;
border:1px solid #cc6666;
border-left:0px;
padding:0px 1px 0px 8px;
font-family:Courier New, Courier;
float:left;
margin:3px 0px 30px 0px;
}
br.clear {
clear:both;
}
</style>
Thank you for any help, I realize these are some really newby like questions but I do need some help, I don't want to pick up any bad habits.