new self()
現在のインスタンスのコンストラクターを使用する適切な方法は何ですか? 言い換えれば、私がするとき:
class Foo{
function create(){
return new self();
}
}
Class Bar extends Foo{
}
$b = new Bar();
echo get_class($b->create());
見たい:Bar
の代わりに:Foo
new self()
現在のインスタンスのコンストラクターを使用する適切な方法は何ですか? 言い換えれば、私がするとき:
class Foo{
function create(){
return new self();
}
}
Class Bar extends Foo{
}
$b = new Bar();
echo get_class($b->create());
見たい:Bar
の代わりに:Foo
class Foo{
function create(){
$c = get_class($this);
return new $c();
}
}
Class Bar extends Foo{
}
$b = new Bar();
echo get_class($b->create());
Store the class type in a temp variable and then return a new instance of it.
public static function create()
{
$class = get_called_class();
return new $class();
}
これはうまくいくはずです。
class Foo{
public static function create()
{
$class = get_called_class();
return new $class();
}
}
class Bar extends Foo{
}
$a = Foo::create();
$b = Bar::create();
echo get_class($a), PHP_EOL, get_class($b);
ショー:
Foo Bar
更新:
非静的が必要な場合は、次のようにします。
<?php
class Foo{
public function create()
{
$class = get_class($this);
return new $class();
}
}
class Bar extends Foo{}
$a = new Bar();
$b = $a->create();
echo get_class($a), PHP_EOL, get_class($b);
?>
ショー:
Bar Bar
Class Bar extends Foo {
function create(){
return self;
}}
子クラスから関数を呼び出す場合、最も近い親を検索して呼び出す場合。これが継承です。
アイデアは、この状況でポリモーフィズムを使用することです。子から関数を再宣言すると、親のアクティビティがオーバーライドされます。親関数も実行したい場合は、次のように呼び出す必要がありますparent::callee();