LoginSignup
0
0

More than 1 year has passed since last update.

PHPで非公開のプロパティを外部から参照・設定する方法

Last updated at Posted at 2020-11-12

次のような非公開なプロパティを外部から参照する方法について、一般的な方法から特殊な方法まであれやこれやと記載していきます。

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()を利用すればもっと黒魔術ができるのかも知れない。

0
0
0

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