次のような非公開なプロパティを外部から参照する方法について、一般的な方法から特殊な方法まであれやこれやと記載していきます。
class App
{
private $hoge = 'ほげほげ';
}
getter/setterを経由する
通常はgetter/setterを経由して非公開のプロパティを取得/設定します。
class App
{
private $hoge = 'ほげほげ';
public function getHoge()
{
return $this->hoge;
}
public function setHoge($hoge)
{
$this->hoge = $hoge;
}
}
$app = new App();
$app->setHoge('ふがふが');
$value = $app->getHoge();
var_dump($value);
//# string(12) "ふがふが"
マジックメソッドを利用する
マジックメソッドの__get
、__set
、__call
を利用して非公開のプロパティやメソッドを無理やり参照可能にできます。
以下の例ではプロパティの存在確認なども端折っていますが、traitを切っておけば他のクラスにも流用可能になります。
trait Xref {
public function __get($name)
{
return $this->$name;
}
public function __set($name, $value)
{
$this->$name = $value;
}
public function __call($name, $argments)
{
return $this->$name(...$argments);
}
}
class App
{
use Xref;
private $hoge = 'ほげほげ';
private function foo() { echo "$this->hoge:「ホゲホゲ」"; }
}
$app = new App();
$app->hoge = 'ふがふが';
$value = $app->hoge;
var_dump($value);
//# string(12) "ふがふが"
$app->foo();
//# ふがふが:「ホゲホゲ」
リフレクションクラスを利用する
PHPにはReflectionClassが用意されています。
$p->setAccessible(true)
とすることでアクセサの制約を無視して外部からプロパティ値の取得や設定が可能になります。
class App
{
private $hoge = 'ほげほげ';
}
function getPropertyValue($object, $propetyName)
{
$ref = new ReflectionClass(get_class($object));
$p = $ref->getProperty($propetyName);
$p->setAccessible(true);
return $p->getValue($object);
}
$app = new App();
$value = getPropertyValue($app, 'hoge');
var_dump($value);
//# string(12) "ほげほげ"
その他
serialize()を利用すればもっと黒魔術ができるのかも知れない。