【问题标题】:Extending The MySQLi Class, Hidden Member Variables扩展 MySQLi 类,隐藏成员变量
【发布时间】:2024-08-28 15:45:02
【问题描述】:

刚开始扩展 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,但它并没有真正提供答案 - 公认的解决方案表明这是不可能的,一个答案与我得出相同的结论,而另一个无关紧要。

The manual for print_r() 建议理论上应该显示我的成员变量,因为它们不是静态的。

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

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

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

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    是的 - 通过覆盖__toString()-Magic 方法,您可以通过编写自己的转储函数来转储它。由于您有自己的环境,您还可以查看使用xdebug 调试 php 并获得更多功能。

    【讨论】:

    • 我终于有机会玩这个了。虽然function __toString() { return print_r( get_object_vars( $this ), true ); } 允许我使用echo $extended_object,但它仍然不允许我使用print_r()var_dump()。我是在正确的轨道上还是这是另一个限制?
    • 没错。 print_r()var_dump() 是内部函数,它们执行自己的逻辑 - 当您尝试 printf()echo() 变量时调用 __toString() 并且可能包含您的逻辑。所以你可以完美地使用__toString()-方法来转储你想要的所有变量。在您的特定情况下,您可以使用 get_parent_class() 向后解析继承类并将其转储。