PHP: как создать экземпляр класса с аргументами из другого класса

Я в ситуациях, когда мне нужно создать экземпляр класса с аргументами из экземпляра другого класса. Вот прототип:

//test.php

class test
{
    function __construct($a, $b, $c)
    {
        echo $a . '<br />';
        echo $b . '<br />';
        echo $c . '<br />';
    }
}

Теперь мне нужно создать экземпляр класса выше, используя класс cls:

class myclass
{
function cls($file_name, $args = array())
{
    include $file_name . ".php";

    if (isset($args))
    {
        // this is where the problem might be, i need to pass as many arguments as test class has.
        $class_instance = new $file_name($args);
    }
    else
    {
        $class_instance = new $file_name();
    }

    return $class_instance;
}
}

Теперь, когда я пытаюсь создать экземпляр тестового класса при передаче ему аргументов:

$myclass = new myclass;
$test = $myclass->cls('test', array('a1', 'b2', 'c3'));

Он дает ошибку: Отсутствует аргумент 1 и 2; передается только первый аргумент.

Это отлично работает, если я создаю экземпляр класса, у которого нет аргументов в его конструкторской функции.

Для опытных разработчиков PHP выше не должно быть большой проблемой. Пожалуйста, помогите.

Спасибо

Ответ 2

Вы можете:

1) Измените тестовый класс, чтобы принять массив, содержащий данные, которые вы хотите передать.

//test.php

class test
{
        function __construct($a)
        {
                echo $a[0] . '<br />';
                echo $a[1] . '<br />';
                echo $a[2] . '<br />';
        }
}

2) инициируйте использование пользовательского метода вместо конструктора и вызовите его с помощью функции call_user_func_array().

//test.php

class test
{
        function __construct()
        {

        }

        public function init($a, $b, $c){
                echo $a . '<br />';
                echo $b . '<br />';
                echo $c . '<br />';
        }

}

В вашем основном классе:

class myclass
{
function cls($file_name, $args = array())
{
        include $file_name . ".php";

        if (isset($args))
        {
                // this is where the problem might be, i need to pass as many arguments as test class has.
                $class_instance = new $file_name($args);
                call_user_func_array(array($class_instance,'init'), $args);
        }
        else
        {
                $class_instance = new $file_name();
        }

        return $class_instance;
}
}

http://www.php.net/manual/en/function.call-user-func-array.php

Наконец, вы можете оставить свои параметры конструктора пустым и использовать func_get_args().

//test.php

class test
{
        function __construct()
        {
                $a = func_get_args();
                echo $a[0] . '<br />';
                echo $a[1] . '<br />';
                echo $a[2] . '<br />';
        }
}

http://sg.php.net/manual/en/function.func-get-args.php

Ответ 3

Вы можете использовать call_user_func_array() Я считаю.

или вы можете оставить список аргументов конструктора, а затем внутри конструктора используйте этот

$args = func_get_args();

Ответ 4

class textProperty
{
    public $start;
    public $end;
    function textProperty($start, $end)
    {
        $this->start = $start;
        $this->end = $end;
    }

}

$object = new textProperty ($ start, $end);

не работают?

Ответ 5

Самый простой способ, который я нашел:

if ($depCount === 0) {
            $instance = new $clazz();
        } elseif ($depCount === 1) {
            $instance = new $clazz($depInstances[0]);
        } elseif ($depCount === 2) {
            $instance = new $clazz($depInstances[0], $depInstances[1]);
        } elseif ($depCount === 3) {
            $instance = new $clazz($depInstances[0], $depInstances[1], $depInstances[2]);
        }

Извините немного, но вы должны понимать идею.