Edited at

mysqli_driver クラスは、インスタンスを生成しても、同じグローバル変数への参照になる

More than 1 year has passed since last update.

MySQLiで、PDO::ERRMODE_EXCEPTION みたいな設定にしたかった。

別のインスタンスを作っても、特に mysqli オブエジェクトとの関連付けをする感じのものがないから、どのインスタンスで設定してもグローバルな設定にされるのかなぁって感じがしたので、確かめた。

<?php

$d1 = new mysqli_driver();
$d2 = new mysqli_driver();

echo $d1->report_mode.PHP_EOL; // 0 (=MYSQLI_REPORT_NONE)
echo $d2->report_mode.PHP_EOL; // 0

$d1->report_mode = MYSQLI_REPORT_ALL;

echo $d1->report_mode.PHP_EOL; // 255
echo $d2->report_mode.PHP_EOL; // 255 ←????!!!!!wwwwww

echo spl_object_hash($d1).PHP_EOL;
// 000000007d27830c0000000039102951
echo spl_object_hash($d2).PHP_EOL;
// 000000007d27830f0000000039102951

var_dump($d1);
var_dump($d2);

オブジェクトハッシュは違うらしい。


var_dumpの結果

object(mysqli_driver)#1 (6) {

["client_info"]=>
string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $"
["client_version"]=>
int(50012)
["driver_version"]=>
int(101009)
["embedded"]=>
bool(false)
["reconnect"]=>
bool(false)
["report_mode"]=>
int(255)
}
object(mysqli_driver)#2 (6) {
["client_info"]=>
string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $"
["client_version"]=>
int(50012)
["driver_version"]=>
int(101009)
["embedded"]=>
bool(false)
["reconnect"]=>
bool(false)
["report_mode"]=>
int(255)
}


内部実装はどうなっているのか

$mysqli_driver->report_modeくらいしか使わないので、これだけ追ってみました。

例によって、自己解釈コメント付き。

家帰ったら追記する