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

是否应使用$this->;声明和访问方法属性;PHP中的var?,php,debugging,error-handling,Php,Debugging,Error Handling,我正在开发一些PHP类,它们可以进行一些基本的分析、调试和错误处理。是的,我知道XDebug,它很棒,但我也希望我的库有一些类来做这类事情 下面是我正在处理的一个类,它将在出现错误时显示一条错误消息,并向我显示发生错误的行号、该行的源代码以及错误行上下的X行数。类似于下图中的。。。(可能必须在新窗口/选项卡中查看图像才能看到更大的版本) 这是我的类代码,我现在已经为这个 <?php class Debugger { public static function debug_so

我正在开发一些PHP类,它们可以进行一些基本的分析、调试和错误处理。是的,我知道XDebug,它很棒,但我也希望我的库有一些类来做这类事情

下面是我正在处理的一个类,它将在出现错误时显示一条错误消息,并向我显示发生错误的行号、该行的源代码以及错误行上下的X行数。类似于下图中的。。。(可能必须在新窗口/选项卡中查看图像才能看到更大的版本)

这是我的类代码,我现在已经为这个

<?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);

?> 

'; 回声'; 回声'; } } //测试上面的类。 $file='bitmask/bitmasktest.php'; $line_number=82; $line_number_padding=5; $debugger=新调试器(); $debugger->debug\u source($file、$line\u number、$line\u number\u padding); ?> 因此,我正在寻找改进和补充的方法。它还没有完成,这只是一个开始

几个基本问题。

1)我应该在顶部声明类中的所有变量吗?例如,在这个类中,我访问如下属性:$file$line\u number$padding。我应该在顶部(所有属性)声明它们吗

<?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)为了使我上面的方法的输出看起来正确,它需要页面下面的CSS数据,我知道我可能应该为它包含一个CSS文件或将其添加到我的其他CSS文件中,但我的目标是使该类自包含,这样该类就可以在任何地方运行并具有正确的输出。我是否应该有一个方法来输出这个类所需的CSS,或者有什么好主意来保持它的自包含性并保持我想要的样子(如图中所示)


#异常错误{
背景:ddd;
字号:1em;
字体系列:无衬线;
文本对齐:左对齐;
颜色:#333333;
}
#异常错误h1,
#异常错误h2{
保证金:0;
填充:1em;
字号:1em;
字体大小:正常;
背景:1911年;
颜色:#FFFFFF;
}
#异常错误h1 a,
#异常错误h2 a{
颜色:#FFFFFF;
}
#异常错误h2{
背景#666666;
}
#异常错误h3{
保证金:0;
填充:0.4em0;
字号:1em;
字体大小:正常;
}
#异常错误{
保证金:0;
填充:.4em;
}
#异常错误a{
颜色:#1b323b;
}
#异常错误{
保证金:0;
填充:0.1毫米0;
}
#异常\错误前置源{
边缘:0.01米;
填充:0.4em;
背景:#fff;
边框:虚线1px#b7c680;
线高:1.2米;
}
#源span.line之前的异常\u错误{
显示:块;
}
#异常\源span.highlight之前的错误{
背景#f0eb96;
}
#异常\源span.line span.number之前的错误{
颜色:#666;
}
.linenum{
文本对齐:右对齐;
背景:#FDECE1;
边框:1px实心#cc6666;
填充:0px 1px 0px 1px;
字体系列:Courier New、Courier;
浮动:左;
宽度:17px;
保证金:3px0px 30px 0px;
} 
代码{/*safari/konq hack*/
字体系列:Courier New、Courier;
} 
.linetext{
宽度:700px;
文本对齐:左对齐;
背景:白色;
边框:1px实心#cc6666;
左边框:0px;
填充:0px 1px 0px 8px;
字体系列:Courier New、Courier;
浮动:左;
保证金:3px0px 30px 0px;
} 
br.clear{
明确:两者皆有;
} 

谢谢您的帮助,我知道这些问题都是非常新的问题,但我确实需要一些帮助,我不想养成任何坏习惯。1)不。属性声明不包括
$this
关键字。您仅在访问属性时使用它,例如

class Foo
{
    private $foo;
    private $bar;

    public function __construct($foo, $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }
}
2) 在这种情况下,我更倾向于在生成的标记中包含所有相关的
style
属性。然后它将真正独立,这就是XDebug如何格式化其调试消息。

1)否。属性声明不包括
$this
关键字。您仅在访问属性时使用它,例如

class Foo
{
    private $foo;
    private $bar;

    public function __construct($foo, $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }
}

2) 在这种情况下,我更倾向于在生成的标记中包含所有相关的
style
属性。然后它将是真正独立的,这就是XDebug如何格式化其调试消息。

首先:声明类属性的方法如下:

class Debugger {
    public $file;
    private $line_number;
    private $padding;
}
现在,类属性只有在对同一对象执行的操作(函数调用)之间保持不变时才有意义——换句话说,如果它们的值可以在调用之间“重用”。在您的情况下,重用其中唯一有意义的是
$padding
(设置一次,然后使用相同的填充多次调用
debug\u source
)。另外两个应保留为功能参数

第二:


除非将所有这些样式内联,否则绝对不可能使
调试器成为自容器,同时让它在页面上下文中生成有效的HTML。当然,这个解决方案远不是最优的,但它是在这种情况下唯一可以使用的解决方案。

首先:声明类属性的方法如下:

class Debugger {
    public $file;
    private $line_number;
    private $padding;
}
现在,类属性只有在对同一对象执行的操作(函数调用)之间保持不变时才有意义——换句话说,如果它们的值可以在调用之间“重用”。在您的情况下,重用其中唯一有意义的是
$padding
(设置一次,然后使用相同的填充多次调用
debug\u source
)。另外两个应保留为功能参数

第二:

您绝对无法使
调试器成为自我容器,并让它同时在页面上下文中生成有效的HTML,除非