Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建一个工厂,动态扩展一个类,使其类型发生变化,但继承父方法?_Php_Oop_Inheritance_Dynamic_Factory Pattern - Fatal编程技术网

Php 如何创建一个工厂,动态扩展一个类,使其类型发生变化,但继承父方法?

Php 如何创建一个工厂,动态扩展一个类,使其类型发生变化,但继承父方法?,php,oop,inheritance,dynamic,factory-pattern,Php,Oop,Inheritance,Dynamic,Factory Pattern,我想做的是有一个静态工厂函数,您可以给它一系列属性,它返回一个对象,该对象属于以前未声明的类,扩展了一个已知的类 基本上: <?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

我想做的是有一个静态工厂函数,您可以给它一系列属性,它返回一个对象,该对象属于以前未声明的类,扩展了一个已知的类

基本上:

<?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
}

但我不知道从哪里开始寻找执行此操作所需的命令。我认为在我的工厂函数中,我需要以某种方式声明$name的值扩展父类,但不对其进行任何更改,然后构造一个新的$name。通过这种方式,它拥有父类的所有功能,只是一种不同的类型。

检查PHP反射API是否有提取和构建新类所需的方法,但是,如何进行提取并创建实例我不确定。我确实知道这是可能的,因为我很确定这就是PHPUnit中模仿的工作方式。您可能还想了解PHPUnit中各种与模拟对象相关的类,以获得一些想法


也就是说,除非您确实在添加/重载方法,否则您为什么还要这样做呢?为什么不在对象中使用属性或使用接口?这里的目标是什么?

要明白这一点:您希望工厂创建一个全新的类,然后从中实例化一个对象?或者换句话说,您希望在运行时创建类。是的,我希望在运行时定义该类,并使其具有与父类相同的所有方法和属性。是的,我知道这有点疯狂。在这种情况下,使用prodigitalson的答案,看看
<?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