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

Php 如何在具有可变输入参数的Factory类中创建动态类?,php,class,Php,Class,如果您对这个问题有更好的标题,请告诉我:) 到目前为止,我通过以下方式创建了我的factory类: include_once('menu.class.php'); 包括_once('gallery.class.php'); 阶级工厂{ 函数new_menu_obj(){返回新菜单(Conn::get_Conn());} 函数new_gallery_obj($type='',$id=''){返回新库(Conn::get_Conn(),$type,$id);} /*这里还有更多定义的函数*/ } 类

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

到目前为止,我通过以下方式创建了我的factory类:

include_once('menu.class.php');
包括_once('gallery.class.php');
阶级工厂{
函数new_menu_obj(){返回新菜单(Conn::get_Conn());}
函数new_gallery_obj($type='',$id=''){返回新库(Conn::get_Conn(),$type,$id);}
/*这里还有更多定义的函数*/
}
类连接{//DB连接}
//要创建一个新的类对象,我只需要这样做
$menu=Factory::新建菜单对象();
$gallery=Factory::new_gallery_obj('some-type','3');
现在,我试图通过使用以下代码来更动态地执行此操作:

include_once('menu.class.php');
包括_once('gallery.class.php');
阶级工厂{
私人$db_conn;
私有函数_u构造(){
$this->db_conn=conn::get_conn();
}
公共函数创建($class\u name){
如果($this->db_conn==null){
$this->db_conn=conn::get_conn();
}
返回新的$class\u名称($this->db\u conn);
}    
}
类连接{//DB连接}
//要创建一个新的类对象,我只需要这样做
$menu=工厂->创建(“菜单”);
$gallery=工厂->创建(“画廊”);//如何在此处传递更多参数?
这是提高效率的“正确方法”吗

当我不知道需要传递多少个变量时,如何创建一个传递变量的新对象?使用数组

使用反射并向
创建方法添加
$params
参数:

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-工厂->任何东西都会失败,我猜你的意思是代码中的工厂::某些东西。无论如何,使用私有构造函数,您将无法在某些静态工厂方法之外创建工厂类的任何实例

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

3-作为一个侧面和个人的注意事项,我不知道你为什么要这样做。您的类的第一个方面做得很好:它创建了一组一致的类。您将使用另一种风格的factory来创建另一组类似但仍然一致的类

例如,Factory类创建菜单和库实例,AltFactory类创建AltMenu和AltGallery实例等等


但是你的工厂的第二个版本失去了这个好处。只需在类上调用new操作符,而不是调用create构造,将获得完全相同的依赖程度,因此…

创建实例,而不是类:))您可以在
create()
方法中使用
func\u get\u args()
并移动数组,使“Menu”或“Gallery”退出。然后使用
call\u user\u func\u array()
调用类的构造函数,并将移位数组作为params数组。这是因为您可以调用具有更多参数的方法,然后为其定义参数。@moonwave99您也可以动态创建类
$args
未定义,可能将其更改为
$params
?谢谢@moonwave99。之前我调用了静态函数
$menu=Factory::new_menu_obj()。有没有办法继续这个功能?PS。这个功能很好用。但是一位老同事指出,@herode有一些有效的参数,所以我想我还是用老代码:)1-是的,我知道。打字错误我创建了一个
全局$factory
,然后
$factory->create('SomeClass')
。至于你其余的评论,我真的无法评论,因为目前这种对工厂和类的“理解”超出了我的能力:)