2016-03-29 11 views
0

Ich bin ein neuer Benutzer von PHP aus C++/Python/Java. In PHP gibt es einen eingebauten Array-Typ, wie kann ich beweisen, dass das Array das gleiche Array ist, nachdem ich ein neues Objekt in das Array eingefügt habe oder eine Kopie des alten? In C++/Python/Java kann ich die Objektadresse, ID() oder Hashcode verwenden, um zu testen, ob das Objekt identisch ist, wie kann ich den gleichen Test in PHP machen?Wie kann ich die Adresse eines Arrays erhalten?

<?php 
    $a['0'] = "a"; 
    $a['1'] = 'b'; //here, $a is a new copied one or just a reference to the old? 
?> 

OK, ich aktualisiere meine Frage, eigentlich gibt es kein spezifisches Problem. Ich möchte nur wissen, ob das Array-Objekt vor und nach dem Einfügen neuer Werte gleich bleibt. In Python, ich könnte ein Test wie diese machen:

a = [1] 

print id(a) 
a.append(2) 
print id(a) 

BTW, ist dies die Funktion id() manuell in Python.

id(...) 
    id(object) -> integer 

    Return the identity of an object. This is guaranteed to be unique among 
    simultaneously existing objects. (Hint: it's the object's memory address.) 

-Code aktualisiert:

# -*- coding: utf-8 -*- 

a = [1, 2, 3] 
b = [1, 2, 3] 

print id(a) 
print id(b) //the id(b) is not same as id(a), so a and b has same content, but they both own their own values in the memory 

c = a // c is a reference to a 
c.append(4) 
print c 
print a //after appending a new value(which means insert a new value to array), a has same value as c 

so das Problem ist ich das Speicherlayout von Code sowohl in C++/Python/Java unter Beweis stellen kann, möchte ich sicherstellen, wenn ich das gleiche tun kann PHP.

+1

Welches Problem müssen Sie lösen? Ihr Code gibt nicht viele Hinweise ... Klingt merkwürdig, dass C++ ein völlig neues Array erstellt, wenn Sie ein Element anfügen: -? –

+2

Ich weiß nichts über C++/Python/Java, aber in PHP ist das Array das gleiche, wenn Sie ein neues Element hinzufügen. – Epodax

+1

PHP hat keinen solchen Mechanismus. Sie müssen beschreiben, welches Problem Sie lösen möchten, um eine geeignete Vorgehensweise in PHP vorzuschlagen. – deceze

Antwort

4

Ja, das Array bleibt das gleiche "Objekt" (nicht was PHP es nennt, aber konzeptionell), wenn Sie seinen Inhalt ändern. Kopien ("soft copies", copy-on-write Kopien) werden nur gemacht, wenn Sie

  • das Array zu einer anderen Variablen zuweisen, ohne Referenz verwendet (=&)
  • Pass es in eine Funktion ohne Referenz
  • return es aus einer Funktion ohne Referenz

(die wirklich alle gleich ist sache: Zuweisung zu einer anderen Variablen.)

+0

Was genau möchten Sie in einem Codebeispiel verdeutlichen? – deceze

+0

Im Kontext von OPs können Sie Ihre Aussage mit Beispielcode binden. Bedeutet, wie jemand Ihre Aussagen programmatisch überprüft? –

+0

Ich nehme an, Sie könnten Low-Level-Debugger-Funktionen verwenden, die die zugrundeliegenden zval-Strukturen ablegen, aber es gibt keine echte Userland-API in PHP, um solche Dinge zu tun/es ist nicht etwas, auf das PHP Ihnen Zugriff gewährt/Sie explizit von solchen Besonderheiten isoliert Erklärung). – deceze

3

Zusätzlich zu dem, was @Anant gepostet hat, siehe PHP Reference Counting, das veranschaulicht, wie Variablen von PHP Runtime-Engine gespeichert werden.

Sie werden sehen, dass auch Array-Elemente Verweise sind, auf die andere Objekte, Arrays und Variablen verweisen können. Also zwei "identische" Arrays, die in C oder Python möglicherweise zwei verschiedene Speicherplätze haben, wird PHP getrennt mit Referenzen gespeichert, die auf einzelne Werte zeigen.

Wenn auf einen dieser Werte zwei Nicht-Referenzvariablen zeigen, erstellt er eine neue Referenz für den geänderten Wert, und nun zeigt jede Variable auf andere Referenzen. Dies ist Copy On Write Optimierung.

Dieser Beitrag von StackExchange Programmierung ist auch gut. Die erste Antwort bietet mehr gute Links: Why are array references rarely used.

5

Standardmäßig werden in PHP nur Objekte als Referenz zugewiesen. Alles andere (einschließlich Arrays) wird nach Wert zugewiesen. Die einzige Möglichkeit, zwei Variablen zu haben, die auf dasselbe Array zeigen, ist das explizite Festlegen einer Referenz mit dem Operator &. Das Kapitel References Explained gibt einen guten Überblick über das Thema.

Im Fall von Objekten Sie Referenzen ziemlich leicht, selbst mit einer einfachen var_dump() beschmutzen können:

$a = new DateTime; 
$b = $a; 
$c = clone $a; 
var_dump($a, $b, $c); 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2016-03-29 10:18:28.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Madrid" 
} 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2016-03-29 10:18:28.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Madrid" 
} 
object(DateTime)#2 (3) { 
    ["date"]=> 
    string(26) "2016-03-29 10:18:28.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Madrid" 
} 

Bitte beachten Sie die #1 Kennung von $a und $b geteilt.

Mit anderen Typen ist überhaupt nicht trivial. In der Spotting References Abschnitt des oben genannten Kapitels gibt es eine user comment mit etwas gewundenen Code, den Sie überprüfen möchten, obwohl es ziemlich alt ist.

Verwandte Themen