PHP:如何使用来自另一个类的参数实例化一个类

2022-08-31 00:25:10

我处于需要使用来自另一个类的实例中的参数实例化类的情况。这是原型:

//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开发人员来说,以上应该不是什么大问题。请帮忙。

谢谢


答案 1

你需要反射 http://php.net/manual/en/class.reflectionclass.php

if(count($args) == 0)
   $obj = new $className;
else {
   $r = new ReflectionClass($className);
   $obj = $r->newInstanceArgs($args);
}

答案 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


推荐