2016-08-08 7 views
1

Ich versuche, auf eine Funktion eines Objekts von einer untergeordneten Klasse zuzugreifen, wobei das Objekt eine geschützte Variable des übergeordneten Elements ist.Zugriff auf eine Elementfunktion eines Objekts, das eine Elementvariable einer übergeordneten Klasse ist

Ich bin nicht ganz sicher, der beste Weg, um darüber zu gehen ... jede Hilfe oder Hinweise würden geschätzt werden.

Unten ist, wie ich es jetzt eingerichtet habe, aber es funktioniert nicht. Es gibt die folgenden Fehler:

Catchable fatal error: Argument 1 passed to App\Parent::__construct() must be an instance of App\Object, none given, called in Controller.php on line 25 and defined in Parent.php on line 12

So wie ich den Fehler zu verstehen, muß ich irgendwie eine Instanz der übergeordneten Klasse in die Child-Klasse übergeben. Aber das scheint ein Anti-Pattern zu sein, weil es die Parent-Klasse erweitert. Ich muss etwas Grundlegendes vermissen.

Parent.php

class Parent 
{ 
    protected $object; 

    public function __construct(Object $object) // line 12 
    { 
     $this->object = $object; 
    } 

} 

Child.php

class Child extends Parent 
{ 
    public function doStuff() 
    { 
     return parent::$object->objectFunction()); 
    } 

} 

Controller.php

... 

namespaces etc 

... 

public function control() 
{ 
    $parent = new Parent(new Object($variable)); 

    $child = new Child(); // line 25 
    $child->doStuff(); 
} 

Antwort

1

Dont instanziiert ein separates Elternklasse, wird es als Teil instanziert werden die von der Instanziierung Kinderklasse.

Übergeben Sie das Objekt auch an die Child-Instanz und erstellen Sie eine __construct() -Methode und übergeben Sie den Parameter an sie.

class Child extends Parent 
{ 
    public __construct($var) 
    { 
     parent::__construct($var); 
    } 

    public function doStuff() 
    { 
     return parent::$object->objectFunction()); 
    } 

} 

Controller.php

public function control() 
{ 
    //$parent = new Parent(new Object($variable)); 

    $child = new Child(new Object($variable)); // line 25 
    $child->doStuff(); 
} 
+0

Danke, das viel mehr Sinn macht, arbeitet es jetzt! Ich werde die Antwort akzeptieren, sobald es mich lässt. –

Verwandte Themen