Sınıf Oluşturucu argümanları Passing

4 Cevap php

Nasıl () işlevi, aşağıda tanımlanan nesne kullanarak sınıf yapıcısı argümanlar keyfi sayıda geçebilir?

<?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 Cevap

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

Yansıması kullanmak gerek sizin tasarım şey overcomplicating olduğunu göstermektedir rağmen. Neden ilk etapta bu işlevi yazmak istiyorsun?

Bunun yerine sınıf ayrılmış parametreleri alarak ben de bir dizi çekmek olurdu.

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

Eğer yapıcı içine func_get_args doğrudan geçmesi sonucunu edebilirsiniz. Tek sorun şimdi dizi anahtarı / değerlerini anlamaya mümkün ediliyor.

Başkasının herhangi bir fikir varsa ben de bilmek mutluluk duyarım :)

Bunu denedim, ama istediğiniz gibi call_user_func_array sesler değil.

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

PHP Documentation bir göz var.

Yansıma yöntemi için bir alternatif, kodunuzu değerlendirmek olacaktır.

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