Передача аргументов в конструктор классов - PullRequest
8 голосов
/ 23 апреля 2009

Как я могу передать произвольное количество аргументов в конструктор класса с помощью функции 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 ]

14 голосов
/ 23 апреля 2009
$klass = new ReflectionClass($classname);
$thing = $klass->newInstanceArgs($args);

Хотя необходимость использовать рефлексию предполагает, что вы слишком усложняете что-то в своем дизайне. Почему вы хотите написать эту функцию в первую очередь?

3 голосов
/ 23 апреля 2009

Вместо того, чтобы ваш класс принимал отдельные параметры, я бы взял массив.

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

Таким образом, вы можете передать прямой результат func_get_args в ваш конструктор. Единственная проблема сейчас заключается в возможности выяснить ключ / значения массива.

Если у кого-то есть какие-либо идеи, я также буду рад узнать:)

0 голосов
/ 27 октября 2011

Альтернативой для метода отражения будет оценка вашего кода.

eval('$instance = new className('.implode(', ', $args).');');
0 голосов
/ 23 апреля 2009

Я не пробовал это, но call_user_func_array звучит так, как вы хотите.

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

Загляните в PHP документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...