如何在具有可变输入参数的Factory类中创建动态类?

时间:2013-10-31 13:23:34

标签: php class

  

如果您对此问题有更好的标题,请告诉我们:)

到目前为止,我通过这样做创建了我的工厂类:

include_once('menu.class.php');
include_once('gallery.class.php');

class Factory {
  function new_menu_obj() { return new Menu(Conn::get_conn()); }
  function new_gallery_obj($type ='', $id='') { return new Gallery(Conn::get_conn(), $type, $id); }
  /* Many more defined functions here */
}

class Conn { // DB connection }

// To create a new class object I just do this
$menu = Factory::new_menu_obj();
$gallery= Factory::new_gallery_obj('some-type','3');

现在,我正在尝试使用此代码更加动态地执行此操作:

include_once('menu.class.php');
include_once('gallery.class.php');

class Factory {

  private $db_conn;

  private function __construct() {
    $this->db_conn = Conn::get_conn();
  }

  public function create( $class_name ) {
    if ( $this->db_conn === null ) {
      $this->db_conn = Conn::get_conn();
    }
    return new $class_name( $this->db_conn );
  }    
}

class Conn { // DB connection }

// To create a new class object I just do this
$menu = Factory->create("Menu");
$gallery= Factory->create("Gallery"); // How do I pass more parameters here?

这是效率的“正确方法”吗? :)
当我不知道需要传递多少变量时,如何创建一个传递变量的新对象?使用数组?

2 个答案:

答案 0 :(得分:1)

使用反射并在$params方法中添加create参数:

class Factory {

  private $db_conn;

  private function __construct() {
    $this->db_conn = Conn::get_conn();
  }

  public function create( $class_name, $params = []) {
    if ( $this->db_conn === null ) {
      $this->db_conn = Conn::get_conn();
    }

    array_unshift($params, $this->db_conn);

    $reflect  = new ReflectionClass($class_name);
    return $reflect->newInstanceArgs($params);    

  }    
}

class Conn { // DB connection }

$menu = Factory->create("Menu");
$gallery= Factory->create("Gallery", ['pics' => ... ])

答案 1 :(得分:1)

1 - 工厂 - >任何都会失败,我想你的意思是代码中的 Factory :: something 。无论如何,使用私有构造函数,您将无法在某些静态工厂方法之外创建Factory类的任何实例...

2 - 因为你使用静态方法,所以在你的函数声明中使用 static 关键字应该是明智的。

3 - 作为一个侧面和个人注释,我不确定你为什么要那样做。你的类的第一个风格是做一个真正的factory工作:它创建一组一致的类。并且您将使用另一种工厂风格来创建另一组类似但仍然一致的类。

E.g。 Factory 类创建菜单图库实例, AltFactory 类创建 AltMenu AltGallery 实例等。

但是你在工厂的第二个版本中放弃了这个好处。只需在您的类上调用 new 运算符而不是调用 create 结构,就会给出完全相同程度的依赖关系,所以......