ここでは、クラス内に定義されたメンバ変数の一覧を取得するサンプルコードを掲載しています。使いどころを間違えると汚いソースコードになりそうな予感がします。
スポンサーリンク
メンバ変数の一覧を取得するサンプル
メンバ変数の一覧を取得して出力しています。詳細はコメントを参照ください。
class myObject
{
// public アクセス修飾子
public $publicAttr = 'public';
// protected アクセス修飾子
protected $_protectedAttr = 'protected';
// private アクセス修飾子
private $_privateAttr = 'private';
public function showMyAttr()
{
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
echo "attr. list of outer\n";
$class = new myObject();
foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";
echo "attr. list of inner\n";
$class->showMyAttr();
// 結果
//=================================================
//attr. list of outer
// publicAttr => public
//attr. list of inner
// publicAttr => public
// _protectedAttr => protected
// _privateAttr => private
クラスを生成した利用者側で取得した属性の一覧は public 属性のみが取得されています。また、クラスメソッド内で取得した属性の一覧は、private を含むすべての属性が一覧で取得されていることから、 それぞれアクセスできる範囲の属性のみが取得されることがわかります。
継承したクラスで取得されるメンバ変数の一覧を取得する
上記で示したサンプルコードを修正し、以下のように myObject を派生させて childMyObject クラスを作成して動作の確認を行っています。
childMyObject クラスインスタンスを生成し、親クラスで定義したメソッド ( showMyAttr ) を呼び出すと、親クラスで private 宣言されたメンバ変数も取得されています。このことから取得可能なメンバ変数の一覧は、そのメソッド本体からアクセス可能なメンバ変数の一覧であり、生成したインスタンス ( この場合は childMyObject ) から直接アクセス可能であるメンバ変数の一覧ではないということがわかります。
class childMyObject extends myObject
{
public function showChildMyAttr()
{
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
echo "attr. list of outer\n";
$child = new childMyObject();
foreach($child as $key => $value) {
print "$key => $value\n";
}
echo "\n";
echo "attr. list of inner(Child)\n";
$child->showChildMyAttr();
echo "\n";
echo "attr. list of inner(Parent)\n";
$child->showMyAttr();
echo "\n";
// 結果
//=================================================
//attr. list of outer
// publicAttr => public
//attr. list of inner(Child)
// publicAttr => public
// _protectedAttr => protected
//attr. list of inner(Parent)
// publicAttr => public
// _protectedAttr => protected
// _privateAttr => private