簡體   English   中英

如何創建一個動態擴展類的工廠,以便其類型發生變化,但它繼承父方法?

[英]How do you create a factory that dynamically extends a class so its type changes but it inherits parent methods?

我想做的是有一個靜態工廠函數,可以提供一系列屬性,它返回一個對象,該對象屬於先前未聲明的類,該類擴展了已知的類。

基本上:

<?php
class foo {
  public $a;

  function increment($b = 1){
    $this->a += $b;
  }
}

function factory($name, $a){
  //returns an object of class $name that extends foo with $this->a set to $a
}

這樣,如果我編寫代碼:

<?php
$bar = factory("bar",12);
$bar->increment(5);
print_r($bar);
if(is_a($bar, "foo")){
  echo "is a Foo";
}
$moo = factory("moo", 4);
$moo->increment();
print_r($moo);
if(is_a($moo, "foo")){
  echo "is a Foo";
}

我得到: [編輯]

bar Object
(
    [a] => 17
)
is a Foo
moo Object
(
    [a] => 5
)
is a Foo

但是我不知道從哪里開始尋找執行此操作所需的命令。 我認為在我的工廠函數中,我需要以某種方式聲明$ name的值擴展了父類,但未對其進行任何更改,然后構造了一個新的$ name。 這樣,它就具有父類的所有功能,只是類型不同。

檢查一下PHP反射API,那里有您需要提取和構建新類所需的方法,但是不確定如何做然后創建它的實例。 我確實知道這是可能的,因為我非常確定這是PHPUnit中Mocking的工作方式。 您可能還希望查看PHPUnit中與Mock對象相關的各種類,以獲取一些想法。

也就是說,除非您實際上要添加/重載方法,否則為什么還要這樣做呢? 為什么不只在對象中使用屬性或使用接口? 這里的目標是什么?

暫無
暫無

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

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