LoginSignup
4
4

More than 5 years have passed since last update.

力技でphpクラスのプライベートメンバ変数にアクセスする

Last updated at Posted at 2015-02-17

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
4
4
4

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
4
4