2016-03-28 15 views
1

Ich habe ein Objekt von dem ich nur den Klassennamen kenne, sagen wir "A". Ich versuche, auf die Eigenschaften dieses Objekts zuzugreifen. Leider versuche ich, auf sie von einer anderen Objektinstanz zuzugreifen, die vom ersten Objekt einer vollständigen anderen Klasse (noch erweitert oder verwandt) erstellt wird. Vereinfachter Code unten, um die Situation zu erklären.Erhalte Eigenschaften von "Parent Creating" Objekt

Class A { 

    public $var; //some important stuff 

    function createObjectB() { 
     $b = new B(); 
    } 
} 

Class B { 
    // a totally different class not related with A 
} 

Dies ist Dritter Code einer Komponente in einem CMS, so kann ich mit Kern-Code nicht mess (oder zumindest ich glaube?) Versuchen, die Immobilie zu übergeben zusammen mit dem B erstellte Objekt ohne Fehler verursacht zu einem späteren Zeitpunkt, wenn diese Komponente aktualisiert wird.

Ich kann das Objekt von Klasse B aufgrund einer "Layout-Vorlage" Datei später in der B-Klasse aufgerufen, die nicht berührt werden, wenn der Kern-Code aktualisiert wird. Auf diese Weise kann ich keine dieser Klassen wirklich berühren.

Mit einem debug_backtrace() von object B kann ich ein paar Schritte zurück die Eigenschaften des Objekts sehen, das ich brauche, aber ich denke, es ist eher hacky, die Funktion auf diese Weise zu verwenden, um die Informationen zu erhalten, die ich brauche, und ich denke, dass es ziemlich ist intensive Funktion auch zu verwenden.

Ich bin ein Anfänger in PHP, ist es einfach falsch, was ich versuche zu erreichen? Gibt es einen besseren Weg?

+0

Können Sie beim Erstellen von B keinen Verweis auf die Klasse A übergeben? '$ b = new B ($ this);' – Federkun

+0

Leider ist es eine Komponente von Drittanbietern, wenn ich mit Core-Dateien hacke, befürchte ich, dass ich später in Schwierigkeiten komme, wenn der Code von den Anbietern aktualisiert wird. Ist das richtig zu denken oder es ist nur ein Aufhebens? – Gruber

+0

Nun, dann scheint das, was Sie wollen, eine globale Variable verwenden. Dies ist ein ** schlechtes Verfahren **, ist aber besser als 'debug_backtrace'. Wenn Sie das Objekt "B" oder das Konstrukt des Objekts "A" erstellen, können Sie '$ GLOBALS ['_ A'] = $ this;' schreiben, dann können Sie es in 'B' mit' $ GLOBALS abrufen ['_A'] -> var'. – Federkun

Antwort

0

Vererbung ist ein gut etabliertes Programmierprinzip, und PHP verwendet es in Ihrer Objektmodellierung. Dieses Prinzip beeinflusst die Art und Weise, wie viele Klassen und Objekte miteinander in Beziehung stehen.

Wenn beispielsweise eine Klasse erweitert wird, erbt die Unterklasse alle öffentlichen und geschützten Methoden der übergeordneten Klasse. Wenn eine Klasse nicht überschrieben wird, behalten diese Methoden ihre ursprüngliche Funktionalität bei.

Dies ist nützlich zum Definieren und Abstrahieren von Funktionen und ermöglicht die Implementierung zusätzlicher Funktionalität in ähnlichen Objekten, ohne dass die gesamte gemeinsam genutzte Funktionalität neu implementiert werden muss.

Wichtig: Wenn Autoloading nicht verwendet wird, müssen Klassen definiert werden, bevor sie verwendet werden. Wenn eine Klasse eine andere erweitert, muss die Elternklasse vor der Kindklassenstruktur deklariert werden. Diese Regel gilt für Klassen, die von anderen Klassen und Schnittstellen erben.

<?php 

class Foo 
{ 
    public function printItem($string) 
    { 
     echo 'Foo: ' . $string . PHP_EOL; 
    } 

    public function printPHP() 
    { 
     echo 'PHP is great.' . PHP_EOL; 
    } 
} 

class bar extends Foo 
{ 
    public function printItem($string) 
    { 
     echo 'Bar: ' . $string . PHP_EOL; 
    } 
} 

$foo = new Foo(); 
$bar = new Bar(); 
$foo->printItem('baz'); // Salida: 'Foo: baz' 
$foo->printPHP();  // Salida: 'PHP is great' 
$bar->printItem('baz'); // Salida: 'Bar: baz' 
$bar->printPHP();  // Salida: 'PHP is great' 

?> 

Sie müssen wissen, dass Sie neue Objekte in andere Klassen generieren können. Sie können jedoch alle Eigenschaften von Klasse A in Klasse B erben, ohne eine neue Instanz zu erstellen. Zum Beispiel:

<?php 

    Class A { 

     public function something() { 
      $var = 'Hello!'; 
      return $var; 
     } 
    } 

    Class B extends A { 

     function createObjectB() { 
      echo $this->something().' I am learning classes in php'; 
     } 
    } 

    $b = new B; 
    $b->createObjectB(); 

?> 

Bitte besuchen Sie diese Seite http://php.net/manual/es/language.oop5.inheritance.php für mehr über.

+0

Vielen Dank Fernando, leider sind die Klassen, mit denen ich arbeite, nicht in irgendeiner Weise verwandt, sie sind komplett getrennt, keine Ausdehnung oder irgendetwas. Ich habe meine Frage bearbeitet, um dies besser hervorzuheben. – Gruber

+1

So. Sie können auch die Schnittstellen und Werkzeuge von PHP verwenden. Erfahren Sie, wie das geht. http://php.net/manual/es/language.oop5.interfaces.php –

+0

Wenn Sie keine Erweiterungen verwenden möchten, um alle Eigenschaften von der Klasse A in die Klasse B zu erben, ist die einzige Zugriffsmöglichkeit auf die Eigenschaften erstellt eine neue Instanz der Klasse und Zugriff auf sie mit für eigene Variable. –