Sonntag, Dezember 15, 2019

Übergeben von Argumenten an den Konstruktor der Klasse

Wie kann ich übergeben eine beliebige Anzahl von Argumenten an den Konstruktor der Klasse mit dem Objekt () – Funktion unten definiert?

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

?>
InformationsquelleAutor Alix Axel | 2009-04-23

4 Kommentare

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

    Obwohl die Notwendigkeit der reflektion verwenden, deutet darauf hin, dass Sie overcomplicating etwas in Ihrem design. Warum wollen Sie schreiben, diese Funktion in Erster Linie?

    • Ich gebe zu, diese Funktion scheint ein wenig Unsinn, aber ich benutze es für kleine Sachen, wo ein Rahmen ist möglicherweise zu aufgebläht. Und da es wirkt als „autoloader“ -, Objekt-Konstruktor singleton-container, es macht den job perfekt.
    • BTW, die Spiegelung Klasse ist wirklich praktisch ist, gibt es einen crash-Kurs auf die neuen features von PHP 5.3? Ich habe in der PHP manual aber ist es mir oder es fehlt eine Menge an Dokumentation?
    • Es ist nicht Sie: Die Dokumentation ist eher spärlich auf, die. Sie haben zu tun mit php.net/oop5.reflection. Auch, es hat etwa seit dem 5.1 (oder 5.0?), es ist also nicht ein neues feature von 5.3
  2. 3

    Statt Ihre Klasse unter getrennten Parametern würde ich es haben, nehmen Sie ein array.

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

    Diese Weise können Sie die direkte Folge der func_get_args in den Konstruktor. Das einzige problem jetzt ist, in der Lage, um herauszufinden, die array-Schlüssel /- Werte.

    Wenn jemand irgendwelche Ideen hat, würde ich auch gerne wissen 🙂

    • Ich habe die gleiche Idee als gut, aber ich war neugierig zu erfahren, wenn so etwas wie ich beschrieben getan werden könnte.
  3. 0

    Habe ich noch nicht ausprobiert, aber call_user_func_array klingt wie Sie wollen.

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

    Haben einen Blick in die In der PHP-Dokumentation.

    • Funktioniert nicht. =\ call_user_func_array(array(new $classname(), ‚__construct‘), $args); funktioniert es, aber dann würde ich den Aufruf der Konstruktor zweimal.
    • Versuchen Sie es ohne new $classname().
    • Fatal error: Non-statische Methode test::__construct() kann nicht aufgerufen werden statisch
    • Okay, ich habe keine Ideen mehr. Danke, dass Sie bereit es zu versuchen.
  4. 0

    Alternative für die Reflexion der Methode, wäre bewerten Sie Ihre code.

    eval('$instance = new className('.implode(', ', $args).');');
    • Eval ist so ziemlich immer eine schlechte Idee

Kostenlose Online-Tests

Ihre Entwicklerrolle