PHP
Mysqli
mysqli_driver

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くらいしか使わないので、これだけ追ってみました。

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

家帰ったら追記する