PHP Referenzen
-
Hallo zusammen,
wie kann ich unterdrücken, dass - nachdem ich einer Variablen einen Wert (von einem Objekt !) zugewiesen habe - sich der Wert der Variablen nach der Änderung des Objektes nicht ändert ? Also zur Veranschaulichung:
//Code $extent_in_mapfile = $map->extent->minx; //$map ist ein Objekt,$map->extent ist aber auch ein Objekt (!) - eine Instanz einer anderen Klasse als $map - und minx ist ein Attribut echo "vorher: " . $extent_in_mapfile; //code //da ändere ich den Wert des Objekts $map->setextent($_GET["minx"], $_GET["miny"], $_GET["maxx"], $_GET["maxy"]); echo "nachher: " . $extent_in_mapfile;
Vorher und nachher liefern zwei unterschiedliche Ergebnisse. Wie kann ich diese Referenz (?) auf das Objekt $map->extent loswerden ?
Ich hoffe, ich habe das ausreichend klar erklärt.
Vielen Dank !
-
Aha, mit define("FULL", $map->extent->minx) geht, ich dachte, da bekomme ich sicher eine Fehlermeldung, das eine Konstante nicht geändert werden darf.
Ist es richtig so ?
-
Irgendwie verstehe ich Dein Problem nicht!
Im von Dir geposteten Code sehe ich keine einzige Referenz, und da bei PHP zuweisungen per Default als copy-by-value gemacht werden sollte vorher==nachher sein. Deine doppelten Objekte dürften da eigentlich kein Problem darstellen, selbst wenn Du innerhalb der Objekten mit copy-by-reference arbeitest.
Gruß Jens
-
Hallo Jens !
Ich habe mich auch gewundert ! Und ich kann es auch nicht verstehen, wieso die Übergabe per reference erfolgt ! Aber es ist so, der Code ist schon richtig. Ich bekomme tatsächlich bei "nachher" einen anderen nämlich den neuen Wert, der ich mit setextent gesetzt habe und der mit der vorigen Zuweisung gar nichts zu tun hat, zurückgeliefert ! Das einzige, was ich mir vorstellen kann, woran es eventuell liegen könnte, ist, dass es eine PHP-Schnittstelle für ein Mapserver (Landkarte und ähnliches Zeug) ist, und das ist mit C programmiert worden und beispielweise auch die Instanzen tue ich nicht mit new erzeugen, sondern einfach durch bloße Zuweisung. Anders kann ich mir das nicht erklären.
Da ein komplettes Programmstück:<?php $map_path = "ms_tmp/"; $map_file = "mymap.map"; //zuerst abfragen, ob Eingabe leer if(trim($_POST["expr"]) == "") { echo "Eingabe leer."; } else { $map = ms_newMapObj($map_path.$map_file); //Konstruktor //je nach Abfrage, Layerobjekt zuweisen if(strtolower($_POST["polygon"]) == "land") { $layer = $map->getLayerByName("LAND"); $shape_filename = "states_ugl"; $column = "STATE"; } else { $layer = $map->getLayerByName("WATER"); $shape_filename = "hydrop_ugl"; $column = "NAME"; } //neues ShapeFileObj erzeugen $layer_src = $layer->data; $dbase_src = $layer->data . ".dbf"; $new_shape_file = ms_newShapefileObj($map->shapepath . "/" . $layer_src, -1); //Konstruktor //Zählvariable $found = 0; //Dbase-Datei durchsuchen if($db_handle = dbase_open("ms_tmp/" . $map->shapepath . "/" . $dbase_src, 0)) { $num_rows = dbase_numrecords($db_handle); $all_records = array(); //zur Aufbereitung von Daten for($i = 1; $i <= $num_rows; $i++) { $record = dbase_get_record_with_names($db_handle, $i); $regular_expr = "/^" . $_POST["expr"] . ".*/i"; if(@preg_match($regular_expr, trim($record[$column]))) { //gefunden Datensätze zählen $found++; //Abfrage in der SHP-Datei durchführen //dbase beginnt bei 1, mapscript aber bei 0 ! $new_shape_extent = $new_shape_file->getExtent($i-1); //extent für den Record $minx = $new_shape_extent->minx; $miny = $new_shape_extent->miny; $maxx = $new_shape_extent->maxx; $maxy = $new_shape_extent->maxy; $return_value = change_coordinates($all_records,$record[$column], $minx,$miny,$maxx,$maxy); /*eigene Methode: wenn nicht gefunden, dann ist ein value unter diesem Namen noch nicht vorhanden und muss eingefügt werden*/ if($return_value == False) { array_push($all_records, trim($record[$column])."|".$minx."|".$miny."|".$maxx."|".$maxy); //eigene Methode } } } //Auswerten, ob irgendwas gefunden: if($found == 0) { echo "Nichts gefunden."; } else { echo 'Die Suche nach "' . $_POST["expr"] . '" ergab ' . $found . ' Ergebnisse, die zu ' . count($all_records) . ' geographischen Objekt(en) zusammengefasst wurden.<br><br>'; print_html($all_records, "|", $layer->name, $column); //eigene Methode } } else { echo "DB Fehler."; } } ?>