プライベートコンストラクターを使って以下を実装したいと思います。
問題はそれget_class()
が戻ることParentBase
です; それでも; get_called_class()
を返しますChildClass
。
基本クラスコンテキストではなく、呼び出し元のクラスコンテキストから__construct()を呼び出すにはどうすればよいですか?
子クラスがたくさんあるので、共有ファクトリメソッドを1つだけにし、子を拡張できないようにします(つまり、newキーワードで作成できないようにします)。
ChildClass::createObject()
プライベートChildClass
コンストラクターとパブリックParentBase
ファクトリメソッドを使用して動作させる方法があるはずです。
<?php
class ParentBase
{
public static function createObject()
{
echo get_class() . "<br/>"; // prints ParentBase
echo get_called_class() . "<br/>"; // prints ChildClass
return new static();
}
}
class ChildClass extends ParentBase
{
private $greeting = "bye";
private function __construct()
{
$this->greeting = "hi";
}
public function greet()
{
echo $this->greeting;
}
}
$child = ChildClass::createObject();
$child->greet();
上記からの出力は次のとおりです。
ParentBase
ChildClass
Fatal error: Call to private ChildClass::__construct() from context 'ParentBase'
保護されたコンストラクターは機能します: http://codepad.viper-7.com/sCgJwA
プライベートコンストラクターはしません: http ://codepad.viper-7.com/YBs7Iz