wake-up-neo.net

Kann ich ein instanziieren? PHP Klasse in einer anderen Klasse?

Ich habe mich gefragt, ob es erlaubt ist, eine Instanz einer Klasse in einer anderen Klasse zu erstellen.

Oder muss ich es außerhalb erstellen und dann durch den Konstruktor weiterleiten? Aber dann hätte ich es geschaffen, ohne zu wissen, ob ich es brauchen würde.

Beispiel (eine Datenbankklasse):

class some{

if(.....){
include SITE_ROOT . 'applicatie/' . 'db.class.php';
$db=new db
41
Richard

Sie können keine Klasse in einer anderen Klasse definieren. Sie sollten Dateien mit anderen Klassen außerhalb der Klasse einschließen. In Ihrem Fall erhalten Sie zwei Klassen der obersten Ebene, db und some. Jetzt können Sie im Konstruktor von some entscheiden, eine Instanz von db zu erstellen. Zum Beispiel:

include SITE_ROOT . 'applicatie/' . 'db.class.php';

class some {

    public function __construct() {
        if (...) {
            $this->db = new db;
        }
    }

}
33

Leute, die sagen, dass es möglich ist, eine Klasse innerhalb einer Klasse zu erstellen, scheinen zu bedeuten, dass es möglich ist, ein Objekt/eine Instanz innerhalb einer Klasse zu erstellen. Ich habe kein Beispiel für eine tatsächliche Klassendefinition in einer anderen Klassendefinition gesehen, die folgendermaßen aussehen würde:

class myClass{

    class myNestedClass{

    }

}

/* THIS IS NOT ALLOWED AND SO IT WON'T WORK */

Da die Frage war "ist es möglich, create eine Klasse inside eine andere Klasse", kann ich jetzt nur annehmen, dass dies NICHT möglich ist.

16
vincentDV

Ich wollte nur darauf hinweisen, dass es möglich ist, eine Klassendefinition dynamisch in eine andere Klassendefinition zu laden.

Lukas hat recht, dass wir keine Klasse innerhalb einer anderen Klasse definieren können, aber wir können sie dynamisch einschließen () oder erfordern (), da jede in der eingeschlossenen Datei definierte Funktion und Klasse einen globalen Gültigkeitsbereich haben wird. Wenn Sie eine Klasse oder Funktion dynamisch laden müssen, fügen Sie die Dateien einfach in eine der Funktionen der Klasse ein. Du kannst das:

function some()
{
    require('db.php');
    $db = new Db();
    ...
}

http://php.net/manual/de/function.include.php

14
rickchristie

In PHP ist es nicht möglich, eine Klasse in einer anderen Klasse zu erstellen .. Ein Objekt (eine Instanz einer Klasse) in einem anderen Objekt zu erstellen, ist etwas anderes.

3
Marius Burz

Nein, das ist nicht möglich. Das Verschachteln von Klassen und das Aggregieren von Objekten sind verschiedene Mechanismen. Verschachtelung von Klassen bedeutet Verschachtelung von Klassennamen in der Tat. Klasse A, die in Klasse B verschachtelt ist, heißt "B\A" (?). Ab Version 5.3 können Sie Klassennamen (und einige andere Namen) in Namespaces verschachteln.

2
Radek M

Dies ist in PHP 7 mit anonymen Klassen möglich.

Siehe das Beispiel aus den Dokumenten :

class Outer
{
    private $prop = 1;
    protected $prop2 = 2;

    protected function func1()
    {
        return 3;
    }

    public function func2()
    {
        return new class($this->prop) extends Outer {
            private $prop3;

            public function __construct($prop)
            {
                $this->prop3 = $prop;
            }

            public function func3()
            {
                return $this->prop2 + $this->prop3 + $this->func1();
            }
        };
    }
}

echo (new Outer)->func2()->func3();
// Output: 6

Dies ist ein einfaches Beispiel, das die Verwendung anonymer Klassen zeigt, jedoch nicht innerhalb einer Klasse:

// Pre PHP 7 code
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// PHP 7+ code
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
1
Jon Surrell

Ich sehe das gerade und möchte meinen Kommentar hinzufügen. Es könnte für jeden von Nutzen sein. Hat jemand von PHP-Eigenschaften gehört? Obwohl Merkmale keine andere Klasse importieren, sondern nur ein Merkmal in eine andere Klasse importieren. Anstatt also zu versuchen, mehrere Klassen zu importieren, können Sie eine Hauptklasse haben, während die Unterklassen sich wie Merkmale verhalten, die es Ihnen ermöglichen, sie in Haupt-/Elternklassen zu verwenden

0
teymzz

(Bearbeiten) Ok Die Frage und das Beispiel, was Sie erreichen wollen, sind verwirrend. In Ihrem Beispiel scheint es, als würden Sie versuchen, eine Klasse innerhalb einer anderen Klasse zu DEFINIEREN.

Der richtige Name dafür ist NESTED CLASS und ist in PHP ..__ nicht möglich. In Ihrem Beispiel lautet die Antwort "NEIN". Nicht in PHP sowieso. Andere Sprachen erlauben "verschachtelte Klassen". Java ist ein Beispiel. 

Zum Beispiel wird dies NICHT in PHP funktionieren

class outer_class{
    class inner_class{
        ...
    }
    ...
}

Jetzt wird die Frage gestellt, ob Sie eine INSTANZ einer Klasse in einer anderen Klasse erstellen.

Darauf lautet die Antwort "JA", Sie können ein "Objekt" innerhalb einer "Klasse" INSTANTIEREN. Wir machen es die ganze Zeit. 

class simple_class{

    protected $instanceOfOtherClass;

    public function instanciateObject_KeepingAReferenceToIt(){
        // create an instance of OtherClass and associate it to $this->instanceOfOtherClass
        $this->instanceOfOtherClass = new OtherClass();
    }

    public function instanciateObject_Without_KeepingAReferenceToIt(){
        // create an instance of OtherClass and return it
        return new OtherClass();
    }
}

Eine Klasse kann sich sogar instanziieren. Das macht der berühmte Singleton und viele andere Creational-Patterns . Leider glauben manche Leute, dass das Wissen um Dependency Injection bedeutet, dass sie nie wieder NEU in einer Methode aufrufen werden. FALSCH.

Es hilft, den Unterschied zwischen einer Klasse und einem Objekt zu verstehen. Ein class ist eine erweiterbare Programmcode-Vorlage zum Erstellen von Objekten .. Ein object verweist auf eine bestimmte Instanz von a Klasse.

0