簡體   English   中英

PHP靜態工廠方法:動態實例化調用類的實例

[英]PHP static factory method: dynamically instantiate instance of the calling class

這個PHP問題與這個問題有關 ,但有點不同。 我有一個名為create()的靜態工廠方法,它實例化一個類實例。 我希望該方法動態實例化調用它的(子)類的實例。 因此,它必須在運行時確定它實例化的類。 但是我想這樣做而不必重新定義子類中的靜態工廠方法(這在我的例子中完全有效,因為子類沒有新的數據成員來初始化)。 這是可能嗎?

class Foo {

  private $name;

  public static function create($name) {

    //HERE INSTED OF:
    return new Foo($name);
    //I WANT SOMETHING LIKE:
    //return new get_class($this)($name);//doesn't work
    //return self($this);//doesn't work either

  }

  private function __construct($name) {

    $this->name = $name;

  }

  public function getName() {

    return $this->name;

  }

}

// the following class has no private data, just extra methods:

class SubFoo extends Foo {

  public function getHelloName() {

    echo "Hello, ", $this->getName(), ".\n";

  }

}


$foo = Foo::create("Joe");
echo $foo->getName(), "\n"; // MUST OUTPUT: Joe

$subFoo = SubFoo::create("Joe");
echo $subFoo->getHelloName(), "\n"; // MUST OUTPUT: Hello, Joe.

您必須使用Late Static Binding創建對象 - 方法get_called_class()很有用。 第二個選項是使用static關鍵字。

例:

class Foo 
{
    private $name;

    public static function create($name) 
    {
        $object = get_called_class();
        return new $object($name);
    }

    private function __construct($name) 
    {
        $this->name = $name;
    }

    public function getName() 
    {
        return $this->name;
    }
}

class SubFoo extends Foo 
{
    public function getHelloName() 
    {
        return "Hello, ". $this->getName();
    }
}

$foo = Foo::create("Joe");
echo $foo->getName(), "\n";

$subFoo = SubFoo::create("Joe");
echo $subFoo->getHelloName(), "\n";

並輸出:

Joe
Hello, Joe

return new static();

已經保留了關鍵字static

是的,有可能與PHP的后期靜態綁定功能。

代替?

$foo = Foo::create("Joe");
echo $foo->getName(), "\n"; // MUST OUTPUT: Joe

$subFoo = SubFoo::create("Joe");
echo $foo->getHelloName(), "\n"; // MUST OUTPUT: Hello, Joe.

嘗試這個

echo parent::getName();
echo self::getHelloName();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM