Reflectionを介してクラスのParentのプロパティにアクセス/変更しようとしています。ReflectionClass :: getProperties()は親のプロパティも取得しますか?
ReflectionClass :: getProperties()を子に実行すると、親にも同様のプロパティが返されますか?
そうでない場合、Reflectionを使用して親プロパティにアクセスする方法はありますか?
Reflectionを介してクラスのParentのプロパティにアクセス/変更しようとしています。ReflectionClass :: getProperties()は親のプロパティも取得しますか?
ReflectionClass :: getProperties()を子に実行すると、親にも同様のプロパティが返されますか?
そうでない場合、Reflectionを使用して親プロパティにアクセスする方法はありますか?
私はこのクイックテストを完了しました。子クラスのプロパティを取得すると、親のプライベートプロパティが隠されているように見えます。ただし、getParentClass()
を呼び出すと、getProperties()
が表示されます。欠落しているプライベート・プロップがあります。
<?php
class Ford {
private $model;
protected $foo;
public $bar;
}
class Car extends Ford {
private $year;
}
$class = new ReflectionClass('Car');
var_dump($class->getProperties()); // First chunk of output
var_dump($class->getParentClass()->getProperties()); // Second chunk
出力(プライベート小道具Ford::model
が欠落している注意してください):
array(3) {
[0]=>
&object(ReflectionProperty)#2 (2) {
["name"]=>
string(4) "year"
["class"]=>
string(3) "Car"
}
[1]=>
&object(ReflectionProperty)#3 (2) {
["name"]=>
string(3) "foo"
["class"]=>
string(4) "Ford"
}
[2]=>
&object(ReflectionProperty)#4 (2) {
["name"]=>
string(3) "bar"
["class"]=>
string(4) "Ford"
}
}
セカンドチャンク(フォードクラスのすべてのプロパティを含む):
array(3) {
[0]=>
&object(ReflectionProperty)#3 (2) {
["name"]=>
string(5) "model"
["class"]=>
string(4) "Ford"
}
[1]=>
&object(ReflectionProperty)#2 (2) {
["name"]=>
string(3) "foo"
["class"]=>
string(4) "Ford"
}
[2]=>
&object(ReflectionProperty)#5 (2) {
["name"]=>
string(3) "bar"
["class"]=>
string(4) "Ford"
}
}
私はあなたが」勝ったと思います子クラスがアクセスできないので親のプライベートプロパティを取得しない
succ受け入れられた答えは、多くの祖先を持つ子クラスの可能性を無視しています。これは私がこれを達成するために使用するインスタンスメソッドです:
public function getProperties() {
$properties = array();
try {
$rc = new \ReflectionClass($this);
do {
$rp = array();
/* @var $p \ReflectionProperty */
foreach ($rc->getProperties() as $p) {
$p->setAccessible(true);
$rp[$p->getName()] = $p->getValue($this);
}
$properties = array_merge($rp, $properties);
} while ($rc = $rc->getParentClass());
} catch (\ReflectionException $e) { }
return $properties;
}
それがルートクラスに到達するまで(およびデフォルトの場合にはその子の特性とそれぞれの親のプロパティをマージしながら、それは、階層を横断します階層の最下部で見つかったデフォルトのみを使用します)。
Gnarly!ありがとう!あなたが$ class-> getParentClass() - > getProperty( 'model') - > setValue($ car、 'F-150')を実行できるかどうか、 – johnnietheblack