php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.12.2008, 17:48  
Erfahrener Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 176
BlackWolf ist zur Zeit noch ein unbeschriebenes Blatt
Standard Zugriff auf aufrufende Klasse

hiho,
sitze gerade an folgendem: Ich muss "irgendwie" auf die Klasse zugreifen, die die aktuelle Methode aufgerufen hat.
Also etwas klarer. Ich habe in etwa sowas:
PHP-Code:
class {
  public 
$value NULL;
  public 
$fields = array();
  
  public function 
__construct($value) {
    
$this->value $value;
    
$this->fields[] = new B();
}

class 
{
  public function 
__construct() {
    
//Hier muss ich auf $value von A zugreifen können
  
}

In diesem Beispiel natürlich simpel, ich könnte $value einfach als Parameter übergeben. In realo habe ich allerdings viel mehr Werte die ich nicht alle als Parameter übergeben will. Jetzt hatte ich mir etwas ausgedacht, weiß aber nicht ob das so geschickt ist. Was ich gemacht habe ist einfach
PHP-Code:
$this->fields[] = new B(&$this); 
Nun kenne ich mich mit Referenzen zu Objekten leider nicht so gut aus. Ich meine prinzipiell hab' ich ja jetzt eine Endlosschleife erzeugt. B bekommt die Instanz von A übergeben, diese enthält wiederrum B das wiederrum die Instanz von A übergeben bekommt ... naja und so weiter.

Meine Frage ist jetzt: Kann man das so machen und wenn ja erzeugt das erheblichen Rechen/Datenaufwand bei PHP? Wie handelt PHP so eine "Endlosschleife"?
Mein Code funktioniert übrigens, ich kann auch nicht feststellen, dass er besonders langsam läuft, mache mir aber Sorgen das es Probleme mit der Performance geben könnte wenn ich viele B-Objekte erzeuge (die ja alle eine Referenz zu A übergeben bekommen).

Code gut? Code schlecht?
Danke
mfg
BlackWolf ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.12.2008, 17:56  
Neuer Benutzer
 
Registriert seit: 01.12.2008
Beiträge: 9
Salkin befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
$this->fields[] = new B(&$this); 
würde ich nicht tun, wird zu fehlern führen.
Zitat:
PHP-Code:
Nun kenne ich mich mit Referenzen zu Objekten leider nicht so gut ausIch meine prinzipiell hab ich ja jetzt eine Endlosschleife erzeugtB bekommt die Instanz von A übergebendiese enthält wiederrum B das wiederrum die Instanz von A übergeben bekommt ... naja und so weiter
hm??? Wegen der Referenz? Nein, du machst damit nur dass beide auf denselben Platz im Arbeitsspeicher zugreifen, dh wenn A was ändert ist es bei B auch so und umgekehrt. Der Variable existiert im speicher nur einmal.

Trotzdem : $this ist ein spezieller Wert, nicht als Referenz übergeben!


PHP-Code:
$instanzA= new A;

 
// nun könntest du rein theorethisch als referenz übergeben, oder du verwendest globale Variablen 
PHP-Code:
class A{
  public 
$value NULL
  public 
$instanzB;
   
  public function 
__construct($value) { 
    
$this->value $value
    
$this->instanzB = new B(); 
  }
}

class 

  public function 
__construct() { 
   echo 
$GLOBALS['instanzA']->value;  //sollte nun value von der Klasse A sein
   
  


Geändert von Salkin (03.12.2008 um 18:00 Uhr).
Salkin ist offline  
Alt 03.12.2008, 18:03  
Erfahrener Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 176
BlackWolf ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Salkin Beitrag anzeigen
PHP-Code:
$this->fields[] = new B(&$this); 
würde ich nicht tun, wird zu fehlern führen.

hm??? Wegen der Referenz? Nein, du machst damit nur dass beide auf denselben Platz im Arbeitsspeicher zugreifen, dh wenn A was ändert ist es bei B auch so und umgekehrt. Der Variable existiert im speicher nur einmal.

Trotzdem : $this ist ein spezieller Wert, nicht als Referenz übergeben!


PHP-Code:
$instanzA= new A;

 
// nun könntest du rein theorethisch als referenz übergeben, oder du verwendest globale Variablen 
PHP-Code:
class A{
  public 
$value NULL
  public 
$instanzB;
   
  public function 
__construct($value) { 
    
$this->value $value
    
$this->instanzB = new B(); 
  }
}

class 

  public function 
__construct() { 
   echo 
$GLOBALS['instanzA']->value;  //sollte nun value von der Klasse A sein
   
  

Danke für die Antwort.
Naja gut, Speicher verbraucht das ganze natürlich nicht da es ja eine Referenz ist. Allerdings müsste PHP - theoretisch - ja unendlich lange rechnen, da es diese Referenz doch unendlich oft erzeugt, oder? Allerdings scheint es sowas wohl zu erkennen ...

Zu deiner Lösung: Die kann ich leider nicht nehmen da der Variablenname von der Instanz von A nicht fest ist.
B ist eigentlich nur eine "Hilfsklasse" von A. Im Klartext: A ist eine Klasse "HTMLForm" die mir HTML-Formulare einfach und valide erzeugen soll. B ist hier "HTMLFormField", also ein Feld innerhalb es Formulars. Allerdings brauche ich in HTMLFormField einigige Informationen aus dem Formular, zu dem das Feld gehört - und genau darum gehts dann im Endeffekt.

mfg
BlackWolf ist offline  
Alt 03.12.2008, 18:07  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Du kannst nicht auf die privaten Eigenschaften einer anderen Klasse zugreifen. Was du hingegen machen kannst, ist, sie als protected zu deklarieren. Nun muss die eine Klasse von der anderen abgeleitet werden und du hast Zugriff auf die Eigenschaften.
Eine andere Möglichkeit wäre ein Iterator-Pattern. Bei diesem werden u.a. Getter und Setter definiert. Beim Iterieren über das Objekt kann die Klasse dann entscheiden, welche Eigenschaften sie zur Verfügung stellt.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 03.12.2008, 18:13  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Code gut? Code schlecht?
Kommt drauf an. Das & kannste bei php5 weglassen.

Was auch ginge, wäre ein statisches Array in A, das die Instanzen über einen Schlüssel verwaltet.

Bspw.
PHP-Code:
class {
  private static 
$instances;

  public 
$value NULL;
  public 
$fields = array();
  
  public static 
getInstance ($key)
    {
    return (
self::$instances[$key]);
    }

  public function 
__construct($value
    {
    
$this->key md5(rand ()); // Bsp. Geht sicher besser
    
self::$instances[$key] = $this;

    
$this->value $value;
    
$this->fields[] = new B($this->key);
    }

}

class 
{
  public function 
__construct($key) {
    
$object A::getInstance  ($key);
    
$object->whatever ();
    
//Hier muss ich auf $value von A zugreifen können
  
}

Natürlich kannst Du die Instanzen auch in einer Registry oder sonsteinem globalen Objekt verwalten. Aber so find ichs schon ganz elegant.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 03.12.2008, 22:11  
Erfahrener Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 176
BlackWolf ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Manko10 Beitrag anzeigen
Du kannst nicht auf die privaten Eigenschaften einer anderen Klasse zugreifen. Was du hingegen machen kannst, ist, sie als protected zu deklarieren. Nun muss die eine Klasse von der anderen abgeleitet werden und du hast Zugriff auf die Eigenschaften.
Eine andere Möglichkeit wäre ein Iterator-Pattern. Bei diesem werden u.a. Getter und Setter definiert. Beim Iterieren über das Objekt kann die Klasse dann entscheiden, welche Eigenschaften sie zur Verfügung stellt.
hm ... wie kommste jez drauf das meine Eigenschaften private sind? Und ableiten geht auch nicht. Falscher Thread?

Zitat:
Zitat von nikosch Beitrag anzeigen
Kommt drauf an. Das & kannste bei php5 weglassen.

Was auch ginge, wäre ein statisches Array in A, das die Instanzen über einen Schlüssel verwaltet.

Bspw.
PHP-Code:
class {
  private static 
$instances;

  public 
$value NULL;
  public 
$fields = array();
  
  public static 
getInstance ($key)
    {
    return (
self::$instances[$key]);
    }

  public function 
__construct($value
    {
    
$this->key md5(rand ()); // Bsp. Geht sicher besser
    
self::$instances[$key] = $this;

    
$this->value $value;
    
$this->fields[] = new B($this->key);
    }

}

class 
{
  public function 
__construct($key) {
    
$object A::getInstance  ($key);
    
$object->whatever ();
    
//Hier muss ich auf $value von A zugreifen können
  
}

Natürlich kannst Du die Instanzen auch in einer Registry oder sonsteinem globalen Objekt verwalten. Aber so find ichs schon ganz elegant.
Hm das gefällt mir, ich denke so mache ich es.
Trotzdem würde ich gerne verstehen, wieso das System wie ich es im Ausgangspost beschrieben habe zu keiner Endlosschleife führt. Sowohl mit als auch ohne & müsste das passieren, nur das ohne & zusätzlich noch der Speicher vollgeschrieben wird weil jedesmal ein neues Objekt erzeugt wird.
Kann mir das jemand erklären?

Ach und ansonsten kann ich nur sagen: Habe jetzt in der Zwischenzeit mit new B(&$this) gearbeitet und bisher funktioniert das sehr gut. Wüsste gerne was da genau bei PHP passiert und wieso / wieso nicht man das verwenden sollte?
Das $this eine spezielle Variable ist stimmt zwar, aber im Grunde enthält sie ja nur die Instanz des Objekts innerhalb der Klasse, also kann ich sie doch prinzipiell auch referenzieren und weitergeben.

Bisschen Aufklärung bei dem Thema wär toll

mfg
BlackWolf ist offline  
Alt 03.12.2008, 22:18  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Nein, nicht falscher Thread. Nur frage ich mich, wo das Problem liegt, wenn die Eigenschaften doch eh public sind 8was eigentlich nicht sein sollte).
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 03.12.2008, 22:23  
Neuer Benutzer
 
Registriert seit: 01.12.2008
Beiträge: 9
Salkin befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von BlackWolf Beitrag anzeigen
Naja gut, Speicher verbraucht das ganze natürlich nicht da es ja eine Referenz ist. Allerdings müsste PHP - theoretisch - ja unendlich lange rechnen, da es diese Referenz doch unendlich oft erzeugt, oder? Allerdings scheint es sowas wohl zu erkennen ...
Wenn du mit php einen Variablen "deklarierst"(also das erste mal verwendest, php macht den rest) wird deinem Variablen ein Platz im Arbeitsspeicher reserviert, wo dann daten reingeschrieben werden können. Damit du diese auch wieder verwenden kannst, muss das Programm auch wissen wo diese Daten stehen, das ist die Adresse.

Mit dieser Adresse kann php nun auf den Inhalt(also die Daten, zb eine Zahl oder ein Text) zugreifen.

Dh, jeder Variable verweißt auf eine Adresse im Arbeitsspeicher. Beim arbeiten mit Variablen wird ständig der Inhalt an dieser Adresse wieder herausgelesen oder geschrieben. Wenn du der Funktion den Variablen $a übergibst, so ließt php die Daten aus dem Arbeitsspeicher und schickt sie der Funktion(= eine Kopie, die Variable in der Funktion bekommt eine andere Adresse, wo dann die Kopie reingeschrieben wird). Wenn du aber eine Referenz(&$a) übergibst, so schickt php der Funktion nicht den Inhalt, sondern nur die Information wo dieser Inhalt zu finden ist, also die Adresse. Dh, du hast nun 2 Variablen, die genau auf denselben Punkt im Arbeitsspeicher zeigen, wenn du mit der Funktion den Inhalt änderst, so wird die originalvariable beim nächsten Lesen des Inhalts auch den neuen WErt bekommen. Also hat Php beim Arbeiten mit Referenzen im Prinzip weniger zu tun. (ob das reell auch so ist weiss ich nicht)

hm, meinst du vielleicht das? Dann wäre es recht einfach:
PHP: extends - Manual
Salkin ist offline  
Alt 04.12.2008, 00:00  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Nein, nicht falscher Thread. Nur frage ich mich, wo das Problem liegt, wenn die Eigenschaften doch eh public sind 8was eigentlich nicht sein sollte).
Ganz einfach: Ihm fehlt das Zugriffsobjekt. Die Methoden sind nicht statisch.

@Salkin: Ich schätze, das ist ihm schon klar.

@bw: Die Referenz wird ja nicht weiter verarbeitet, sie wird ja nur zugewiesen. Und wenn sie verarbeitet wird (bspw. in print_r) lotet PHP die Schleifen aus. Ich glaube irgendwo habe ich mal gelesen, dass das nicht immer klappt (war m.E. bei nem var_export oder so)...
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (04.12.2008 um 00:04 Uhr).
nikosch ist offline  
Alt 04.12.2008, 00:04  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Ich habe ihn jetzt aber so verstanden, dass die Übergabe des Objektes selbst kein Problem ist. Er will nur nicht jede Eigenschaft einzeln vergeben und das muss er bei Übergabe des Objekts ja auch nicht.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Klasse aus externer Klasse aufrufen kostja PHP Tipps 2008 8 07.08.2008 14:13
aufrufende Klasse und Funktion abfragen?? galaxyshadow PHP Tipps 2008 4 10.06.2008 06:43
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
Zugriff auf Objekte anderer Klassen nieselfriem PHP Tipps 2007 7 14.05.2007 12:48
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Zugriff auf eine Klasse innerhalb einer Funktion -> Fehle PHP-Fortgeschrittene 23 05.02.2006 13:02
Klasenname einer nicht instanziierten Klasse DerDesian PHP Tipps 2007 9 30.11.2005 13:13
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Führerschein für Klasse A+B.. Preis OK??? Off-Topic Diskussionen 20 13.07.2005 18:44
Rückgabewert auf einer Klasse anders als in der Klasse micbur PHP Tipps 2005-2 6 10.06.2005 15:06
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
error: Zugriff auf protected variable aus extendet klasse PHP Tipps 2004 3 26.09.2004 23:39
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php verweis auf aufrufende klasse, php aufrufende klasse, php aufrufende instanz, auf aufrufende klasse zugreifen, net auf eigenschaft aufrufende klasse zugreifen, php aufrufende klasse ausgeben, referenz auf aufrufende klasse, php referenz aufrufende instanz, php variable aufrufende klasse, auf andere klasse zugreifen php, php zugriff auf protected variablen, fields_array an nächste php übergeben, php in klasse aufrufende klasse zugreifen, auf aufrufende klasse verweisen, php aus klasse auf aufrufende klasse zugreifen, php zugriff auf __construct variable, php zugriff aus einer funktion auf eine variable vom __construct, php aufrufende funktion, aufrufende funktion php, function __construct zugriff

Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum