0

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

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

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?

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

4

2 回答 2

1

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

2 - 由于您使用静态方法,因此在函数声明中使用static关键字应该是明智的。

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

例如,Factory类创建MenuGallery实例,AltFactory类创建AltMenuAltGallery实例等等。

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

于 2013-10-31T13:41:25.550 回答
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' => ... ])
于 2013-10-31T13:31:23.140 回答