我刚刚开始扩展MySQLi类,发现在使用print_r
或var_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开发环境中测试它。
答案 0 :(得分:1)
是 - 通过覆盖__toString() - Magic Method,您可以通过编写自己的转储功能将其转储。由于你有自己的环境,你也可以查看用xdebug调试php并获得更多的权力。