在singleton工厂中使用params实例化类

时间:2011-03-28 04:03:13

标签: php singleton

我有一个产生单例类的类。 (请注意,对于此问题,这是过于简化的代码,例如,它不会检查文件路径是否存在)

class Singleton
{
   public function Load($classname, $params)
   {
      $filepath = 'classes/'.$classname.'.php';
      require_once($filepath);
      return $classname();
   }

}

现在说我想传递一个参数数组,这些参数的大小可以与正在创建的类的构造函数不同。做这个的最好方式是什么?我设想的是call_user_func_array但是对于类来说?

2 个答案:

答案 0 :(得分:2)

使用PHP's Reflection library可以获得一些有趣的结果。

function Load( $class, $args )
{
    $reflection = new ReflectionClass( $class );
    $object = $reflection->newInstanceArgs( $args );
    return $object;
}

这是简化的,意味着使用__autoload函数,如果你使用它们也不会检查名称空间,而且每次调用它时都会创建一个新的类实例,所以你&& #39;我需要实现一个对象数组来跟踪你已经创建了哪些对象......

对于基本文档:$class是一个字符串,其中包含您希望实例化的类的名称,而$args是一个您将要传递给的参数数组__construct( )方法。

答案 1 :(得分:0)

未测试,但为什么不将它们加载到构造函数中?即返回$classname($params);您的构造函数设置为__construct($params = false).然后您可以检查params是否通过,使您的构造函数参数可选...

这确实意味着你的所有类都需要具有相同的构造函数。

    class Foo {

        public function __construct($params = false) {
            if($params === false) 
                echo 'not passed';
            else 
                print_r($params);
        }
    }

$class = 'Foo';
$foo = new $class(array('one', 'two'));
$foo2 = new $class();

输出: 数组([0] =>一[1] =>二) 没有通过