LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-15

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

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

家帰ったら追記する

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1