扩展MySQLi类,隐藏成员变量

时间:2011-12-14 16:22:58

标签: php mysqli

我刚刚开始扩展MySQLi类,发现在使用print_rvar_dump等时,子类中创建的成员变量不会显示为对象的一部分

以此示例为例

class Database extends MySQLi {
    public function __construct( $h, $u, $p, $n ) {
        parent::__construct( $h, $u, $p, $n );

        $this->name = $n;
    }
}

运行以下内容时,会在MySQLi对象中看到的成员变量存在并成功输出。但是,我创建的成员变量不存在。

$obj = new Database( 'a', 'b', 'c', 'd' )
print_r( $obj );

但我发现我可以成功使用echo $obj->name来电。

在进一步检查时,我能够使用以下方法成功检查对象:

print_r( get_object_vars( $obj ) );

Array
(
    [name] => my_database
    [affected_rows] => 
    [client_info] => 
    [client_version] =>

[...]

我发现this question但它并没有真正提供答案 - 接受的解决方案表明它是不可能的,一个答案与我的结论相同,另一个答案是无关紧要的。

print_r()

The manual表示理论上应该显示我的成员变量,因为它们不是静态的。

  

print_r(),var_dump()和var_export()也将显示protected和   PHP的对象的私有属性。静态类成员将   不显示。

有没有一种方法可以扩展MySQLi类,并且能够使用print_r快速调试我的数据库对象,而不需要get_object_vars()。这是预期的行为还是应该向PHP的开发人员报告的错误?

我在Windows 7上使用PHP 5.3.5版。我还没有在我的Linux开发环境中测试它。

1 个答案:

答案 0 :(得分:1)

是 - 通过覆盖__toString() - Magic Method,您可以通过编写自己的转储功能将其转储。由于你有自己的环境,你也可以查看用xdebug调试php并获得更多的权力。