douguomou5094 2011-03-24 01:47
浏览 53
已采纳

是否应该使用PHP中的$ this-> var声明和访问方法属性?

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)

source code class

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.

  • 写回答

2条回答 默认 最新

  • douzuita7325 2011-03-24 01:54
    关注

    First: the way to declare class properties is like this:

    class Debugger {
        public $file;
        private $line_number;
        private $padding;
    }
    

    Now, class properties only make sense if they remain constant between operations (function calls) performed on the same object -- in other words, if their values can be "reused" between calls. In your case, the only one of these which it makes sense to reuse is $padding (set it once and then call debug_source multiple times with the same padding). The other two should remain function parameters.

    Second:

    There is absolutely no way you can make Debugger be self-container and have it produce valid HTML in the context of your page at the same time, unless you make all those styles inline. Of course this solution is far from optimal, but it's the only one that you can use in this case.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹
  • ¥15 联想笔记本开机出现系统更新界面