将参数传递给类构造函数

时间:2009-04-23 00:59:59

标签: php class object

如何使用下面定义的Object()函数将任意数量的参数传递给类构造函数?

<?php

/*
./index.php
*/

function Object($object)
{
    static $instance = array();

    if (is_file('./' . $object . '.php') === true)
    {
        $class = basename($object);

        if (array_key_exists($class, $instance) === false)
        {
            if (class_exists($class, false) === false)
            {
                require('./' . $object . '.php');
            }

            /*
            How can I pass custom arguments, using the
            func_get_args() function to the class constructor?

            $instance[$class] = new $class(func_get_arg(1), func_get_arg(2), ...);
            */

            $instance[$class] = new $class();
        }

        return $instance[$class];
    }

    return false;
}

/*
How do I make this work?
*/

Object('libraries/DB', 'DATABASE', 'USERNAME', 'PASSWORD')->Query(/* Some Query */);

/*
./libraries/DB.php
*/

class DB
{
    public function __construct($database, $username, $password, $host = 'localhost', $port = 3306)
    {
        // do stuff here
    }
}

?>

4 个答案:

答案 0 :(得分:14)

$klass = new ReflectionClass($classname);
$thing = $klass->newInstanceArgs($args);

虽然需要使用反射表明您在设计中过于复杂。你为什么要首先写这个函数?

答案 1 :(得分:3)

而不是你的类采用分离的参数,我需要一个数组。

class DB
{
    public function __construct(array $params)
    {
        // do stuff here
    }
}

这样你就可以将func_get_args的直接结果传递给你的构造函数。现在唯一的问题是能够找出数组键/值。

如果其他人有任何想法,我也很高兴知道:)

答案 2 :(得分:0)

我没试过,但call_user_func_array听起来像你想要的。

$thing = call_user_func_array(array($classname, '__construct'), $args);

查看PHP Documentation

答案 3 :(得分:0)

反射方法的替代方法是评估您的代码。

eval('$instance = new className('.implode(', ', $args).');');