LoginSignup
0
0

More than 5 years have passed since last update.

privateなコンストラクタを外部からコールする

Last updated at Posted at 2013-12-19

こちらでprivateなコンストラクタがあるクラスをnewする方法について模索しています。
http://qiita.com/mpyw/items/b3d974c073e6484d51a4
が、解決策1~3どれも結局__construct()を呼び出してないじゃない、ということで無理矢理呼び出してみます。

<?php
class HOGE{
    public $value = 0;
    private function __construct(){
        $this->value = 1;
    }
}


function getInstance($class){
    $tmp = <<< HOGEHOGE
    class HOGEHOGE extends $class{
        public function __construct(){
            \$method = new ReflectionMethod('$class', '__construct');
            \$method->setAccessible(true);
            \$method->invoke(\$this);
        }
    }

    \$hogehoge = new HOGEHOGE();
HOGEHOGE;

    eval($tmp);
    return $hogehoge;
}


    $instance = getInstance('HOGE');

    print $instance->value; // 1

実際にできあがるインスタンスはHOGEじゃなくてHOGEHOGEになるけどそこはまあ気にするな。

protectedであればinvokeとか使わず普通にparent::__construct()するだけでいいです。

なおeval()は超危険関数なので、間違ってもこんなことを実環境で行わないように。
まあprivateな__construct()に処理が書いてある時点で異常ですが。

反則ですが、使えるようであればrunkit_method_redefine()が最強でしょう。

0
0
2

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