Re: Gibts eine Art "parent::" bei Objektinstanzen in Objektinstanzen (nicht vererbt)?
Von: Ulf Kadner (dr_logic@gmx.net) [Profil]
Datum: 04.07.2008 00:19
Message-ID: <g4jj97$650$02$1@news.t-online.com>
Newsgroup: de.comp.lang.php.misc
Datum: 04.07.2008 00:19
Message-ID: <g4jj97$650$02$1@news.t-online.com>
Newsgroup: de.comp.lang.php.misc
Christian wrote: > class foo { > function ding() { > echo "Dong!"; > } > > function foo() { > $this->bar = new bar(); > } > } > > class bar { > function anybody_out_there() { > return isset(parent::ding); > // Syntaktisch natürlich völliger Quatsch > } > > function bar() { > if ($this->anybody_out_there()) parent::ding(); > // Logisch falsch, da bar nicht von foo abstammt > // und somit kein parent:: existiert > } > } > > $test = new foo(); > > Wie ihr sehen könnt, suche ich einen Weg, im Konstruktor der Klasse bar > die Methode ding() der "übergeordneten" Objektinstanz aufzurufen, und > zwar in Abhängigkeit der Prüfung, ob die Methode "ding()" überhaupt > deklariert ist... > > Geht sowas? Wenn ja: wie? Zu aller erst: Es gibt keinen Grund mehr für veraltetes PHP4 zu entwickeln! PHP4 wird nicht mehr weiterentwickelt. PHP5 ist aktuell! Zum Problem: Wenn Du unbedingt die bestehende Instanz von foo für den Aufruf von ->ding() nutzen will wirst Du nicht umhin kommen diese dem Konstruktor als Parameter zu übergeben. Wenn die Instanz egal ist könntest Du mit debug_backtrace() arbeiten. Ich setze dazu allerdings PHP5 voraus (Wegen ReflectionClass-Nutzung) Also erst mal muss der Constructor von foo so verändert werden, das dieser erkennt wenn er von bar aus initialisiert wird und in dem Fall nicht nochmal bar initialisiert (Führt sonst zu einem Endlos-Loop) Das umzusetzen dieses Ansinnens kann auf mehreren Wegen passieren: public function __construct() { $td = debug_backtrace(); if (sizeof($td) < 2 || !isset($td[1]['class']) || $td[1]['class'] != 'bar') { $this->bar = new bar(); } } in der Klasse bar brauchst Du eine Methode, die Dir den Namen der aufrufenden Klasse zurück gibt: private function getLoadingClass(array $tracedata, $currclass) { foreach ($tracedata as $dataset) { if (!isset($dataset['class']) || $dataset['class'] == $currclass) { continue; } return $dataset['class']; } return false; } Die Methode anybody_out_there() in was passendes umbenennen und eine neue Instanz des benötigten Objekts, oder bool FALSE zurück geben lassen. z.B.: private function loadCallingClassInstance() { $owner = $this->getLoadingClass( debug_backtrace(), get_class($this) ); if (false === $owner) return false; $rc = new ReflectionClass($owner); if ($rc->hasMethod('ding')) return new $owner; return false; } letztendlich noch den Constructor von bar anpassen: public function __construct() { if (false === ($obj=$this->loadCallingClassInstance())) return; $obj->ding(); } Du siehst das ist letztendlich viel Aufwand, der durch übergabe der foo-Instanz als bar Konstruktor-Parameter um einiges verringert werden kann. MfG, Ulf[ Auf dieses Posting antworten ]
Antworten
- Christian (04.07.2008 08:42)
- David Fuhr (04.07.2008 09:49)
- Michael Fesser (04.07.2008 13:23)
- Christian (04.07.2008 20:18)
