こちらで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()が最強でしょう。