Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Klasseninstanzen in PHP (https://www.delphipraxis.net/70706-%5Bphp%5D-klasseninstanzen-php.html)

3_of_8 3. Jun 2006 01:34


[PHP] Klasseninstanzen in PHP
 
Morgen. Ich erzeuge mir eine Klasse, und will im Konstruktor eine Referenz auf die Instanz in ein globales Array speichern, in etwa so:

Code:
global $objects;

class MyClass {

  public $title;

  function MyClass($title) {
    $this->title=$title;
    $GLOBALS["objects"][$title]=&$this;
  }

}
Das wäre jetzt meine Idee gewesen. Funktioniert aber nicht. Die =& Anweisung hat überhaupt keinen Effekt. Wenn ich statt =& schreibe = funktioniert es zwar scheinbar, aber ich habe ein Kopie und keine Referenz.

titus 3. Jun 2006 01:47

Re: [PHP] Klasseninstanzen in PHP
 
Was bitte willst du denn da machen? Ich versteh denn Sinn davon nicht ganz :gruebel: :-D

mfG, titus

Mystic 3. Jun 2006 01:52

Re: [PHP] Klasseninstanzen in PHP
 
Sollte der Konstruktor nicht __construct($title) heissen?

titus 3. Jun 2006 01:58

Re: [PHP] Klasseninstanzen in PHP
 
Naja in PHP5 aber in PHP4 ging es noch so:

new MyClass(...);

mfG, titus

3_of_8 3. Jun 2006 09:53

Re: [PHP] Klasseninstanzen in PHP
 
Also der Konstruktor wird zumindest aufgerufen. Soweit scheints noch zu passen.

Ich will einfach, dass bei der Instantiierung der Klasse ein Pointer auf die Instanz in ein globales Array gespeichert wird. Der Grund ist, dass ich die Instanzen der Klasse verwalten will.

Frickeldrecktuxer_TM 3. Jun 2006 10:26

Re: [PHP] Klasseninstanzen in PHP
 
Zitat:

Zitat von 3_of_8
Die =& Anweisung hat überhaupt keinen Effekt. Wenn ich statt =& schreibe = funktioniert es zwar scheinbar, aber ich habe ein Kopie und keine Referenz.

Welchen Wert hat denn $objects[$title] danach? Vielleicht bringt die Lektüre des Handbuchs (und zwar weiter als nur das erste Code-Beispiel) ein wenig Erleuchtung.

7eddi 3. Jun 2006 10:30

Re: [PHP] Klasseninstanzen in PHP
 
Also bei mir funktioniert beides, mit und ohne Referenzierung mit &.

Code:
<?php

  header('Content-type: text/plain');

  $objects = array();
 
  class MyClass {
    public $title;
   
    function MyClass($title) {
      $this->title = $title;
      $GLOBALS['objects'][$title] = $this; # bzw. &$this
    }
  }
 
  $myobj = new MyClass('A');
 
  # Objekt verändern
  $objects['A']->title = 'B';
 
  # Objekt-Eigenschaften ausgeben
  echo $myobj.': '.$myobj->title."\r\n";
  echo $objects['A'].': '.$objects['A']->title;

?>
Beidesmal spuckt mir das Script:

Object id #1: B
Object id #1: B

aus. Mich würde aber trotzdem mal interessieren, was bei der Zuweisung von $this nun eigentlich passiert. In Delphi hätte ich jetzt gesagt: Ist doch klar, $this ist ja schon ein Zeiger auf das Objekt, deswegen braucht man das auch nicht zu referenzieren... In PHP bin ich mir grad nicht so sicher :gruebel:.

7eddi 3. Jun 2006 11:24

Re: [PHP] Klasseninstanzen in PHP
 
Das Handbuch hilft schonmal weiter :-), zumindest wenn man auch den letzten Kommentar von aib liest.

Zitat:

Note that the "new" operator no longer returns a copy of the constructed object, but the object itself. This behavior may be as of PHP 5.x.

This means that
$foo = new class();
and
$foo =& new class();
are equivalent now, and you don't have to worry about the problems stated on this page.

3_of_8 3. Jun 2006 11:57

Re: [PHP] Klasseninstanzen in PHP
 
Ja, und? Mein Problem bleibt trotzdem bestehen. Mein Code sieht ja in etwa so aus:

$a = new a();

Jetzt will ich, dass im Konstruktor eine Referenz auf das erzeugte Objekt in das Array gespeichert wird.

alcaeus 3. Jun 2006 12:37

Re: [PHP] Klasseninstanzen in PHP
 
Ja, und?

Code:
$a = new a();
$objects[] = &$a;
Happy? Ich glaub dass du mit dem $this-Operator nicht so einfach & verwenden kannst.

Greetz
alcaeus

PS: Es ist = &$a, und nicht =& $a. Das & gehoert zu $a, und nicht zum =.

3_of_8 3. Jun 2006 12:42

Re: [PHP] Klasseninstanzen in PHP
 
Argh!

Verfluchtes SelfPHP. Das steht =& $var drin.

Nie wieder glaube ich dem Viech.

Ich hab jetzt den Fehler gefunden und, oben ging es nur um den Konstruktor, dass der eine Referenz zurückgibt und dass da = und = & gleich sind. Jetzt merke ich, dass das immer so ist.

Auf jeden Fall funktioniert es jetzt endlich. Danke @all.

3_of_8 8. Jun 2006 00:29

Re: [PHP] Klasseninstanzen in PHP
 
Grmpf...

Ich versteh das einfach nicht:

Folgender Testcode:

Code:
<?php

class a {

  var $s;

  function a() {
 
    global $objects;
    $objects["a"]= &$this;
  }

}

$a=new a();
$objects["a"]->s="asdf";

echo($objects["a"]->s."\n");
echo($a->s."\n");

?>
So, jetzt die Überraschung:

Lokal, xampp, PHP 5. Ausgabe: asdf asdf (wie erwartet)
Online, Kilu, PHP 4. Ausgabe: asdf

Das bedeutet für mich (verknüpft mit anderen, ähnlichen Tests):
Die Klassenrefenzen werden in PHP4 nicht übernommen Zumindest nicht bei mir.

Bitte testet das Script mal auf eurem Webspace.

Matze 8. Jun 2006 06:28

Re: [PHP] Klasseninstanzen in PHP
 
Hi, Version 4.4.2:

Zitat:

asdf
Tut mir Leid, sieht aber so aus, als ginge das in PHP 4 wirklich nicht.

3_of_8 8. Jun 2006 09:20

Re: [PHP] Klasseninstanzen in PHP
 
Das muss doch irgendwie möglich sein...

Got it.

Das geht schon, nur in PHP 4 seltsamerweise nicht im Konstruktor.

3_of_8 8. Jun 2006 09:53

Re: [PHP] Klasseninstanzen in PHP
 
Hab grade auch den Grund gefunden: http://www.php.net/manual/de/language.oop.newref.php

Vor allem der erste Kommentar (englisch) ist sehr aufschlussreich.

Mein Problem besteht trotzdem.

omata 8. Jun 2006 15:31

Re: [PHP] Klasseninstanzen in PHP
 
Hallo 3_of_8,

was spricht gegen...

Code:
<?php

class a {

  var $s;

  function a() {

  }

}

$a = new a();
$a->s = "asdf";

echo($a->s."\n");

?>
Was soll das komische $objects?

Verwirrte Grüsse
Thorsten

3_of_8 13. Jun 2006 17:05

Re: [PHP] Klasseninstanzen in PHP
 
Das ist ja nur ein Beispiel. Ich muss nachher auf alle Klasseninstanzen von der Klasse zugreifen können, dazu speichere ich eine Referenz in $objects.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz