如果您对此问题有更好的标题,请告诉我们:)
到目前为止,我通过这样做创建了我的工厂类:
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?
这是效率的“正确方法”吗? :)
当我不知道需要传递多少变量时,如何创建一个传递变量的新对象?使用数组?
答案 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 结构,就会给出完全相同程度的依赖关系,所以......