Goal
サードパーティのライブラリなど自分がさわれないクラスでプライベート属性を参照するメソッドが用意されていないケースで、
var_dumpすればprivateメンバ変数が見えているのに、その値を取得することができないのが歯がゆい.
デバッグ用途に限定してreadだけでもプログラムからアクセスできるようにしたい.
object(Person)#1 (3) {
["name":"Person":private]=>
string(12) "Isaac Newton"
["birthday":"Person":private]=>
string(10) "1643-01-04"
["role":"Person":private]=>
string(9) "physicist"
}
var_dumpすれば見えている↑のprivate値をどうにかプログラムから取得したい.
Code
インスタンスをprivateメンバ変数も含めて連想配列に変換する
* インスタンスを配列型でキャストしてjson文字列に変換
* NULLバイトを削除
* 連想配列モードでjson文字列をデコード
* "クラス名プロパティ名"のキーでアクセスできるようになる
function convert_debuggable_assoc($obj) {
$json_str = json_encode( (array) $obj );
$json_str = str_replace("\u0000", "", $json_str);
$obj_array = json_decode( $json_str, /*assoc=*/ true );
return $obj_array;
}
テストコード
<?php
# privateのメンバ変数を持ち、参照用publicメソッドを持たないクラスを定義
class Person {
private $name;
private $birthday;
private $role;
public function __construct($params) {
$this->name = $params['name'];
$this->birthday = $params['birthday'];
$this->role = $params['role'];
}
}
function convert_debuggable_assoc($obj) {
$json_str = json_encode( (array) $obj );
$json_str = str_replace("\u0000", "", $json_str);
$obj_array = json_decode( $json_str, /*assoc=*/ true );
return $obj_array;
}
$person = new Person([
'name' => 'Isaac Newton', 'birthday' => '1643-01-04', 'role' => 'physicist',
]);
$person_arr = convert_debuggable_assoc($person);
echo $person_arr['Personname'];
# Personクラスのnameプロパティが、Personnameとしてアクセスできるようになる
# Isaac Newton
# echo $person->name;
# Fatal error: Cannot access private property Person::$name
Environment
$ uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
$ /usr/local/php-5.5.4/bin/php -v
PHP 5.5.4 (cli) (built: Mar 11 2014 11:06:57)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
$ /usr/local/php-5.6.0/bin/php -v
PHP 5.6.0 (cli) (built: Aug 29 2014 06:35:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies