PHP: başka bir sınıf içinde gelen argümanlar ile bir sınıf örneğini nasıl

4 Cevap php

I am in a situations where i need to instantiate a class with arguments from within an instance of another class. Here is the prototype:

//test.php

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

Şimdi, ben sınıfın cls fonksiyonu aşağıda kullanarak sınıfının üzerinde örneğini gerekir:

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;
}
}

Şimdi ben buna argüman geçerken test sınıfının bir örneğini oluşturmaya çalıştığınızda:

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

It gives error: Missing argument 1 and 2; only first argument is passed.

I yapıcı işlevi argümanları yok olan bir sınıf örneğini gayet iyi çalışır.

Deneyimli PHP geliştiricileri için, yukarıda pek bir sorun olmamalıdır. Lütfen yardım edin.

Teşekkürler

4 Cevap

Eğer Yansıma ihtiyacınız http://php.net/manual/en/class.reflectionclass.php

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

Şunları yapabilirsiniz:

1) Eğer geçmek istediğiniz verileri içeren bir dizi, kabul test sınıfını değiştirin.

//test.php

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

2) bir kullanıcı yöntemini yerine kurucuyu kullanarak başlatmak ve call_user_func_array() işlevini kullanarak diyoruz.

//test.php

class test
{
        function __construct()
        {

        }

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

}

Ana sınıfında:

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

Son olarak, boş senin yapıcı params bırakabilir ve kullanmak 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

Sen call_user_func_array() İnanıyorum kullanabilirsiniz.

veya yapıcı argümanlar listesini bırakın ve sonra Kurucuların içinde bu kullanabilirsiniz

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

}

$ Nesne = new TextProperty ($ başlangıç, $ sonu);

işe yaramazsa?