Namen eines Objektes herausfinden
Harry
- php
0 Matze0 Sven Rautenberg0 Antje Hofmann0 Antje Hofmann0 Harry0 Antje Hofmann0 Harry0 Lösung gefunden
Harry0 Harry
Holladiewaldfee,
vielleicht steh ich ja nur total auf der Leitung, oder gibt es in PHP wirklich keine Möglichkeit, herauszufinden, wie das Objekt heißt, auf dem man gerade arbeitet? Der Name der zugrundeliegenden Klasse wäre ja kein Problem (außerhalb der Klasse mit get_class, innerhalb mit __CLASS__). Aber so was wie __OBJECT__ gibt's ja leider nicht.
Nochmal zur Erklärung:
---
class xyz
{ function WerBinIch()
{ echo 'Mein Name als Objekt ist: '.???; }
}
$DasTolleObjekt = new xyz();
$DasTolleObjekt->WerBinIch();
---
Das sollte dann "'Mein Name als Objekt ist: DasTolleObjekt" ausgeben.
Mein Problem lässt sich nicht durch Verwendung von $this umgehen, das Objekt muß seinen eigenen Namen in Erfahrung bringen können.
Ich würde auch gerne vermeiden, dem Objekt seinen Namen explizit mitteilen zu müssen.
Danke schonmal.
Ciao,
Harry
Object.name???
Aber was für einen Sinn hat s wenn du das Objekt nicht kennst.
wie willst Du es anspechen?
Gruss Matze
Holladiewaldfee,
Object.name???
Häh? Wie? Wo? Wer?
Kannst Du mir das bitte als Beispiel servieren?
--
class xyz()
{ function bla()
{ echo $this.name; }
}
$foo = new xyz();
$foo->bla();
--
Gibt nicht "foo" aus sondern wie erwartet "Objectname"
Aber was für einen Sinn hat s wenn du das Objekt nicht kennst.
wie willst Du es anspechen?
Das Objekt (A) ruft in einer Funktion eine Funktion eines anderen Objektes (B) auf und muß diesem seinen Namen mitteilen, da B zu einem späteren Zeitpunkt eine andere Funktion von A über ein eval(...) aufrufen muß.
Ciao,
Harry
Moin!
Das Objekt (A) ruft in einer Funktion eine Funktion eines anderen Objektes (B) auf und muß diesem seinen Namen mitteilen, da B zu einem späteren Zeitpunkt eine andere Funktion von A über ein eval(...) aufrufen muß.
Das klingt oberhäßlich. Ist es mit Sicherheit auch. Warum so kompliziert? Warum eval()? Bäh...! :)
- Sven Rautenberg
Holladiewaldfee,
Das klingt oberhäßlich. Ist es mit Sicherheit auch. Warum so kompliziert? Warum eval()? Bäh...! :)
Wenn Du dynamisch Funktionen aufrufen mußt, deren Namen Du vorher nicht kennst? Ich mag eval ja auch nicht, aber die Alternativen halten sich in Grenzen.
Prinzipiell ist dieses eine eval() der einzig hässliche Punkt an der ganzen Idee.
Ciao,
Harry
Nommal ich,
Wenn Du dynamisch Funktionen aufrufen mußt, deren Namen Du vorher nicht kennst? Ich mag eval ja auch nicht, aber die Alternativen halten sich in Grenzen.
Vielleicht noch call_user_func, aber das ist meiner Meinung nach mindestens genauso hässlich, vor allem weil dieses eine eval gleichzeitig normale Funktionen und Objektfunktionen aufrufen kann.
Harry
Entschuldige ich sollte nicht immer ein gewisses Grundverständniss für Fachsprache vorrausetzen.
this.name ist nicht anderes als die Methode name des Objektes welches Du als this ansprichst aufzurufen.
Nichts anders verbirgt sich hinter meiner Aussage, object.name
Ob das Objekt dann letzten endes parent top oder meinobject ist interesiert eigentlich nicht oder??
Gruss matze
Ps eval ist so ziemlich die ungeschickteste Variante die man nehmen kann.
Holladiewaldfee,
Entschuldige ich sollte nicht immer ein gewisses Grundverständniss für Fachsprache vorrausetzen.
Kannst Du bei mir eigentlich schon.
this.name ist nicht anderes als die Methode name des Objektes welches Du als this ansprichst aufzurufen.
Ist mir bewußt.
Ich habe aber den Eindruck daß Du eher von JS-Objekten redest, wo man z.B. mit window.name den Namen des Objektes Window abfragen oder so.
So weit ich weiß gibt es aber die Form objekt.eigenschaft in PHP nicht, dort heißt das ja objekt->eigenschaft.
Die Eigenschaft name ist aber nicht definiert, d.h. this->name gibt wie erwartet nichts aus, $this.name erkennt PHP mehr oder weniger als Quatsch und gibt "Object" für $this und "name" als Namen der undefinierten Konstanten name im zusammengesetzten String $this.name aus.
Nichts anders verbirgt sich hinter meiner Aussage, object.name
Ob das Objekt dann letzten endes parent top oder meinobject ist interesiert eigentlich nicht oder??
Ich glaube Du redest wirklich von JavaScript?!
Ps eval ist so ziemlich die ungeschickteste Variante die man nehmen kann.
Weiß ich.
Nenne mir eine Alternative.
Das Problem ist hier [?t=53158&m=294084] nochmal als Beispielcode.
Ciao,
Harry
Servus,
Ich glaube Du redest wirklich von JavaScript?!
Nein ich rede nicht von Java Script sondern von Objektorientierte Programierung allgemein und mit der Aussage Object.name meine Ich, dass jedes Objekt ohnehin eine methode name hat, die Dir den Objektnamen zurückliefert. Das (object).name war allgemein angedacht.
Gruss Matze
PS oder solote das bei PHP völlig anderster sein als sonst?
Servus, sowas wie Du vor hast, sollte man eigentlich vermeiden.
Aber grundsätzlich wurde Ich ganz zu beginn ein Object erzeugen, welches ein einfaches hash hat.
Diesem hash würde Ich jedes Object, welches du zur Laufzeit erzeugst als Referenz bekannt geben.
Danach arbeitest du die Liste durch und kannst jedem element den Namen erfragen.
Zu Kompliziert?
Stichwort Object handling Doku / Buch Objektorietierte Programierung.
Grus Matze
Holladiewaldfee,
Servus, sowas wie Du vor hast, sollte man eigentlich vermeiden.
Hab ich jetzt auch.
Aber grundsätzlich wurde Ich ganz zu beginn ein Object erzeugen, welches ein einfaches hash hat.
Diesem hash würde Ich jedes Object, welches du zur Laufzeit erzeugst als Referenz bekannt geben.
Genauso hab ich's jetzt gelöst, aber wie gesagt, ich hatte früher ein Problem mit der Referenz von $this wenn sie innerhalb der Konstruktoren übergeben wurde. Ich hab gestern den ganzen Tag geschuftet und alles so weit umgeschrieben, daß es jetzt mit den Referenzen läuft.
Das ist sogar besser als die alte Lösung, da das ganze etwas an Flexibilität gewinnt.
Zu Kompliziert?
Nö ;)
Zwei Rekursive Funktionen, die sich gegenseitig per Referenz Objekte zu spielen und je nach Zustand dieses Objektes anders abgearbeitet werden müssen, das fand ich kompliziert ;)
Stichwort Object handling Doku / Buch Objektorietierte Programierung.
Stichwort "Rumprobieren bis die Kiste abkratzt"
Ciao,
Harry
Servus,
Das ist sogar besser als die alte Lösung, da das ganze etwas an Flexibilität gewinnt.
da freu ich mich, dass Ich dir dabei etwas helfen konnte.
Stichwort Object handling Doku / Buch Objektorietierte Programierung.
Stichwort "Rumprobieren bis die Kiste abkratzt"
Wie heisst es so schön, probiern geht über studieren *grins
Gruss Matze
Holladiewaldfee,
PS oder solote das bei PHP völlig anderster sein als sonst?
Ja, PHP bietet den Luxus einer object.name Eigenschaft/Methode nicht. Das war ja mein Problem ;)
Ciao,
Harry
Moin!
vielleicht steh ich ja nur total auf der Leitung, oder gibt es in PHP wirklich keine Möglichkeit, herauszufinden, wie das Objekt heißt, auf dem man gerade arbeitet? Der Name der zugrundeliegenden Klasse wäre ja kein Problem (außerhalb der Klasse mit get_class, innerhalb mit __CLASS__). Aber so was wie __OBJECT__ gibt's ja leider nicht.
Würdest du mir mal mitteilen, wozu du diese Information benötigst? Vielleicht hast du ja nur einen Denkknoten.
$DasTolleObjekt = new xyz();
$DasTolleObjekt->WerBinIch();
Das sollte dann "'Mein Name als Objekt ist: DasTolleObjekt" ausgeben.
Naja, im Prinzip ist dein Verlangen irgendwie blöde rekursiv: Ohne Wissen des Objektnamens $DasTolleObjekt kannst du den Namen "DasTolleObjekt" mit der zu findenden Namensmethode ja nicht herausbekommen. Insofern ist dein Vorhaben irgendwie ... schräg.
- Sven Rautenberg
Holladiewaldfee,
Würdest du mir mal mitteilen, wozu du diese Information benötigst? Vielleicht hast du ja nur einen Denkknoten.
Ich werd's probieren, ist etwas komplizierter.
Ich lege ein Objekt $abc einer Klasse def an.
Dann lege ich ein zweites Objekt $uvw einer Klasse xyz an.
Beim Aufruf einer bestimmten Funktion, abc->fabc() soll abc dem Objekt uvw mittelien, daß dieses bitte die Funktion abc->fabc2() aufrufen soll, wenn die Funktion $uvw->fuvw() aufgerufen wird.
Dazu muß $uvw aber irgendwie der Name "abc" mitgeteilt werden, damit "uvw" weiß, zu welchem Objekt denn die aufzurufende Funktion gehört.
Das Ganze ist im Prinzip so eine Art Event-Modell.
Naja, im Prinzip ist dein Verlangen irgendwie blöde rekursiv: Ohne Wissen des Objektnamens $DasTolleObjekt kannst du den Namen "DasTolleObjekt" mit der zu findenden Namensmethode ja nicht herausbekommen. Insofern ist dein Vorhaben irgendwie ... schräg.
Kann sein.
Ich will eigentlich nur, daß das Objekt weiß, wie es heißt ;)
Ciao,
Harry
Moin!
Ich lege ein Objekt $abc einer Klasse def an.
Dann lege ich ein zweites Objekt $uvw einer Klasse xyz an.Beim Aufruf einer bestimmten Funktion, abc->fabc() soll abc dem Objekt uvw mittelien, daß dieses bitte die Funktion abc->fabc2() aufrufen soll, wenn die Funktion $uvw->fuvw() aufgerufen wird.
Dazu muß $uvw aber irgendwie der Name "abc" mitgeteilt werden, damit "uvw" weiß, zu welchem Objekt denn die aufzurufende Funktion gehört.
Klingt eigentlich so, als ob $abc ein Unterobjekt von $uvw sein sollte. Bzw. dass die Klasse xyz die der Klasse def um die gewünschten Methoden erweitern sollte. Oder etwa nicht?
- Sven Rautenberg
Holladiewaldfee,
Klingt eigentlich so, als ob $abc ein Unterobjekt von $uvw sein sollte. Bzw. dass die Klasse xyz die der Klasse def um die gewünschten Methoden erweitern sollte. Oder etwa nicht?
So ähnlich.
Beispielcode:
---
class event
{ $funcs = array();
function reg($funcname)
$this->funcs[] = $funcname;
function call()
{ for($i=0, $j=count($this->funcs); $i<$j; $i++)
eval($this->funcs[$i]); }
}
class test
{ function regme()
$GLOBALS['eventobj']->reg(MEINNAME.'->blabla()');
function blabla()
echo 'blabla';
}
$eventobj = new event();
$testobj = new test();
$testobj->regme();
$eventobj->call();
---
Das sollte dann "blabla" ausgeben.
Die Sache ist natürlich in Wirklichkeit wesentlich komplizierter und verworrener ;)
Ciao,
Harry
Hallo Harry,
So ähnlich.
Du machst es Dir aber auch irgendwie unnötig kompliziert:
class event
{
var $funcs = array();
function reg($obj, $funcname)
$this->funcs[] = array (&$obj, $funcname);
function call () {
foreach ($this->funcs as $func) {
call_user_func ($func);
}
}
}
class test
{
function regme() {
$GLOBALS['eventobj']->reg(&$this, 'blabla');
}
function blabla() {
echo 'blabla';
}
}
$eventobj = new event();
$testobj = new test();
$testobj->regme();
$eventobj->call();
Viele Grüße,
Christian
Holladiewaldfee,
Du machst es Dir aber auch irgendwie unnötig kompliziert:
Jein, ich hatte fürher schonmal mit den Referenzen rumgespielt, hab dann aber irgendwo Probleme bekommen, weil dieses regme() in einigen Fällen auch im Konstruktor aufgerufen wird.
Ich hab jetzt aber ein paar Sachen umgestellt, so daß das auch mit der Referenz im Konstruktor funktioniert.
Übrigens ist call_user_func fast so häßlich wie eval() ;-)
Danke Dir.
Ciao,
Harry
Hallo Harry,
Jein, ich hatte fürher schonmal mit den Referenzen rumgespielt, hab dann aber irgendwo Probleme bekommen, weil dieses regme() in einigen Fällen auch im Konstruktor aufgerufen wird.
Dann musst Du das Objekt per $obj =& new Klasse (...); instanzieren: http://de3.php.net/manual/de/language.oop.newref.php
Übrigens ist call_user_func fast so häßlich wie eval() ;-)
Finde ich nicht. call_user_func startet nicht extra einen Parser, es schaut sich lediglich die Argumente an. eval() dagegen parst den ganzen Code.
Viele Grüße,
Christian
Holladiewaldfee,
Dann musst Du das Objekt per $obj =& new Klasse (...); instanzieren: http://de3.php.net/manual/de/language.oop.newref.php
Hab ich jetzt auch rausgefunden, nachdem ich mir diesen Teil der Anleitung mal durchgelesen hab (so vor ungefähr einer Woche). Danke aber trotzdem ;)
Irgendwie ist das eine der Stellen wo sich meiner Meinung nach die Schwächen von PHP offenbaren.
Übrigens ist call_user_func fast so häßlich wie eval() ;-)
Finde ich nicht. call_user_func startet nicht extra einen Parser, es schaut sich lediglich die Argumente an. eval() dagegen parst den ganzen Code.
Finde ich schon. Allein schon die Idee, die Objekt-Funktion aufgesplittet als Array übergeben zu müssen ... *örks*
Auf jeden Fall ist sie aber ungefährlicher ;)
Ciao,
Harry
Hallo Harry,
Irgendwie ist das eine der Stellen wo sich meiner Meinung nach die Schwächen von PHP offenbaren.
In PHP 5 ist dem zum Glück nicht mehr so, da werden Objekte standardmäßig per Referenz übergeben.
Viele Grüße,
Christian
Holladiewaldfee,
In PHP 5 ist dem zum Glück nicht mehr so, da werden Objekte standardmäßig per Referenz übergeben.
andere Frage: Hast Du's hinbekommen, PHP5b1 und PHP 4 parallel zu betreiben? Die haben da einige Dateien mit gleichen Namen, die ich eigentlich nicht einfach so überschreiben will ...
Da wären php4ts.dll und der Apache-Filter.
Ciao,
Harry
Hallo Harry
vielleicht steh ich ja nur total auf der Leitung, oder gibt es in PHP wirklich keine Möglichkeit, herauszufinden, wie das Objekt heißt, auf dem man gerade arbeitet? Der Name der zugrundeliegenden Klasse wäre ja kein Problem (außerhalb der Klasse mit get_class, innerhalb mit __CLASS__). Aber so was wie __OBJECT__ gibt's ja leider nicht.
$DasTolleObjekt = new xyz();
$DasTolleObjekt->WerBinIch();
du möchtest also wissen, wie der Name einer Instanz einer Klasse heißt?
Ich habe mir zu diesem Zweck mal eine kleine Funktion geschrieben, die genau diese Information ermittelt.
Voraussetzung, der Name der Klasse von dem eine Instanz erzeugt wurde ist bekannt.
<?php
class Hyperlink {
}
class other_class {
}
$myClass=new Hyperlink;
$myClass2=new Hyperlink;
$myClass3=new other_class;
function instance_exists($arg) {
if (class_exists($arg)) {
$vars = $GLOBALS;
foreach ($vars as $key=>$val)
if (!(is_object($val) && get_class($val)==strtoLower($arg))) unset($vars[$key]);
return array_keys($vars);
}
return false;
}
var_dump(instance_exists("Hyperlink"));
?>
Vielleicht hilft dir diese Funktion weiter.
Viele Grüße
Antje
:-)
das funktioniert zwar, löscht aber bestehende Variablen.
weil $vars = $GLOBALS; eine Referenz erzeugt.
also hier die korrigierte Funktion:
function instance_exists($arg) {
if (class_exists($arg)) {
$vars = array();
foreach ($GLOBALS as $key=>$val)
if (!(is_object($val) && get_class($val)==strtoLower($arg))) continue;
else $vars[] = $key;
return $vars;
}
return false;
}
Viele Grüße
Antje
Holladiewaldfee Antje,
also hier die korrigierte Funktion:
vielen Dank erstmal, aber soweit ich das verstanden habe (und wie der Name der Funktion besagt) kann ich mit der Funktion ja nur rausfinden, ob eine Instanz der Klasse erzeugt wurde und die Namen der Instanzen ermitteln.
Damit kommt das Objekt ja aber nicht an seinen eigenen Namen heran, denn wenn mehrere Instanzen der Klasse existieren, kann das Objekt selbst ja nicht unterscheiden, welche der zur Auswahl stehenden Instanzen es denn nun ist. Wenn nur eine Instanz existieren würde hätte ich das Problem ja nicht.
So wie's aussieht werde ich dem Objekt doch explizit seinen Namen mitteilen müssen ...
Ciao,
Harry
Hallo Harry,
Damit kommt das Objekt ja aber nicht an seinen eigenen Namen heran, denn wenn mehrere Instanzen der Klasse existieren, kann das Objekt selbst ja nicht unterscheiden, welche der zur Auswahl stehenden Instanzen es denn nun ist. Wenn nur eine Instanz existieren würde hätte ich das Problem ja nicht.
wenn du eine Methode des Objektes selbst aufrufst, so kannst du das Objekt mit $this referenzieren. Für einen Bezug auf sich selbst brauchst du den Instanznamen nicht.
Für alle anderen Fälle kannst du $this auch anwenden.
Beispiel:
class Hyperlink {
function Hyperlink($t) {
$this->t=$t;
}
function r($arr) {
if (is_array($arr)) {
for ($i=0;$i<count($arr);$i++)
if ($GLOBALS[$arr[$i]] !== $this) echo $arr[$i];
} }
}
Ich habe hier eine Eigenschaft t definiert zur Unterscheidung der Instanzen und eine Methode r zur Verarbeitung. Hier vergleiche ich die Liste der Instanzen mit dem Objekt selbst. Sind diese verschieden, so wird der Instanzname ausgegeben.
$myClass=new Hyperlink(0);
$myClass2=new Hyperlink(1);
$myClass->r(instance_exists("Hyperlink"));
Dies funktioniert solange, wie Instanzen mit verschiedenen Eigenschaften existieren. Sind beide Instanzen vollständig identisch, werden sie nicht als verschieden betrachtet.
Viele Grüße
Antje
Holladiewaldfee,
if ($GLOBALS[$arr[$i]] !== $this) echo $arr[$i];
ich glaube genau mit dieser Zeile kommen wir der Sache schon ein gutes Stück näher ;)
Prinzipiell müsste ich ja nur alle Variablen aus $GLOBALS mit $this vergleichen ... das dürfte ja nur ein einziges wahres Ergebnis bringen, nämlich dann, wenn die globale Variable das Objekt selbst ist ...
Werd's gleich mal probieren, vielen Dank für Deine Hilfe.
Ciao,
Harry
Holladiewaldfee,
es funzt. Danke, Antja :)
Die Lösung für's Archiv:
---
class xyz
{ function who()
{ while(list($k, $v)=each($GLOBALS))
{ if($GLOBALS[$k]===$this)
echo "Ich heisse ".$k;
}
}
}
$bla = new xyz();
$bla->who();
---
Ausgabe: "Ich heiße bla".
Ciao,
Harry
es funzt. Danke, Antja :)
Ja, was schreib ich denn?
Antje, latürnich ;)
Ciao,
Har*wofürgibteseinevorschau*ry