Warum ist der refcount 2 nicht 1?

8
%Vor%

Ausgabe:

%Vor%

Ausgabe:

%Vor%

AKTUALISIEREN

Sehr enttäuscht über die Antwort ...

    
ajx 19.11.2010, 02:37
quelle

5 Antworten

27

void debug_zval_dump (gemischte $ variable );

Code :

%Vor%

Ausgabe :

%Vor%

Erläuterung : Da der Refcount von $ var 1 ist, optimiert PHP dies und behandelt den Speicher direkt, anstatt eine Kopie zu erstellen, da es keine Möglichkeit gibt, andere Referenzen zu kontaminieren. PHP übergibt intern $ var per Referenz, so dass es den Speicher direkt bearbeiten kann, wenn es auch benötigt wird. Die zweite Referenz wird erstellt, wenn Sie debug_zval_dump () aufrufen.

Ein Refcount von 2 ist hier extrem nicht offensichtlich. Also, was ist los?

Wenn eine Variable einen einzelnen Verweis hat (wie $ var, bevor sie als Argument für debug_zval_dump () verwendet wurde), optimiert die Engine von PHP die Art und Weise, wie sie an eine Funktion übergeben wird. Intern behandelt PHP $ var wie eine Referenz (indem der refcount für den Umfang dieser Funktion erhöht wird), mit der Einschränkung, dass, wenn die übergebene Referenz zufällig geschrieben wird, eine Kopie erstellt wird, aber nur zum Zeitpunkt des Schreibens . Dies wird als "Kopie beim Schreiben" bezeichnet.

Wenn also debug_zval_dump () zufällig in seinen einzigen Parameter geschrieben wird (und das nicht tut), wird eine Kopie erstellt. Bis dahin bleibt der Parameter eine Referenz, wodurch der Refcount für den Umfang des Funktionsaufrufs auf 2 erhöht wird.

Code :

%Vor%

Ausgabe :

%Vor%

Erläuterung : Diesmal wird eine Kopie von $ var gemacht, wenn die Funktion aufgerufen wird. Dies liegt daran, dass $ var zweimal referenziert wird und PHP keine anderen Referenzen verfälschen möchte, so dass es eine Kopie von $ var erstellt, an der es selbst arbeiten kann. Da es jetzt ein separates Stück Speicher gibt, das nur für den Bereich des Funktionsaufrufs verwendet wird, hat es nur einen Verweis, es ist selbst. Also für den Umfang der Funktion ist der Refcount der Kopie 1 (es ist selbst).

    
Mark Tomlin 19.11.2010 02:41
quelle
7

Ich denke, die Dokumentation für diese Methode erklärt dies unter dem Abschnitt "Achtung der Ref Count":

debug_zval_dump

    
Steve Sheldon 22.04.2011 13:55
quelle
2

Code :

%Vor%

Ausgabe : long(1) refcount(2)

Erklärung : Wenn eine Variable einen einzelnen Verweis hat, wie $ var, bevor sie als Argument für debug_zval_dump () verwendet wurde, optimiert die Engine von PHP die Art und Weise, wie sie an eine Funktion übergeben wird. PHP macht grundsätzlich einen Zeiger auf die Variable und intern behandelt PHP $ var wie eine Referenz und so wird refcount für den Umfang dieser Funktion erhöht.

Code :

%Vor%

Ausgabe : long(1) refcount(1)

Erklärung : Hier ist die $ var-Variable beim Schreiben kopiert , Eine neue seprate-Instanz dieser Variablen wird erstellt, und da debug_zval_dump eine komplett neue Kopie von $ var behandelt, keine Referenz, ist refcount gleich 1. Die Kopie wird dann zerstört, sobald die Funktion fertig ist.

Hoffe, dass es aufklärt.

    
Mark Tomlin 25.04.2011 08:41
quelle
1

Ich werde versuchen, der Funktion debug_zval_dump() und der Art, wie Sie Ihre Variablen verarbeiten, mehr Licht zu geben. Töte mich nicht, wenn ich falsch liege:) ...

%Vor%

Ich denke, die Debug-Funktion zählt die $var refcount (1) und die 1 refcount (2), da 1 der Wert von $var ist.
Wenn Sie es logisch betrachten, sagen Sie das tatsächlich.

%Vor%

Zweiter Teil:

%Vor%

Was Sie hier sehen, ist, dass Sie $var auf $var_dup setzen, aber seinen Wert beibehalten. Der Refcount von $var ist 1, weil Sie ihn mit $var_dup verknüpft haben.

%Vor%

Das ergibt long(3) refcount(1) ... Warum ist refcount 1? Wie Sie sehen können, wurde der Wert von $ var_dup nie 3 zugewiesen, sollte es 2 richtig sein? Nein, sollte es nicht, weil Sie es mit & amp; $ var auf dem neuesten Stand halten. Das heißt, wenn Sie $var = 4 zwischen $var = 3 und debug_zval_dump($var_dup);exit; überschritten haben, wird der Wert von $ var_dup automatisch aktualisiert, weil Sie sie verlinkt haben, was zu einem Refcount führt.

Dann gibt es dieses andere Vorkommen:

%Vor%

Die Ausgabe ist: long(2) refcount(2) . Wie Sie sehen können, ist der Wert von $ var_dup korrekt. $ var war 2, der Wert wurde über $ var_dup übergeben und er blieb dabei. Der Refcount ist 2, weil counts $var = 4; und $var_dup = $var; zählt. Wenn wir $var = 4; entfernen, erhalten wir Folgendes:

%Vor%

Die Ausgabe ist: long(2) refcount(3) . Nun zählt die Debug-Funktion folgendes: $var_dup (1), =$var (2) (da $ var_dup von $ var stammt) und $var ( = 2; ) (3).

Ich hoffe du verstehst was ich meine. Meiner Meinung nach ist das mehr Mathe als Programmieren, also mag das der Grund sein, warum es schwierig ist, das zu verstehen.

Und wieder, wenn ich falsch liege, töte mich nicht:) ...
Grüße,
Mixxiphoid

Haftungsausschluss
Ich weiß nicht, was der Zweck dieser Funktion ist. Ich habe bis heute nie davon gehört. Also bin ich nicht verantwortlich für unangemessene Verwendung:).

    
Mixxiphoid 19.04.2011 17:22
quelle
1

Ein Refcount von 2 ist hier extrem nicht offensichtlich. Vor allem unter Berücksichtigung der obigen Beispiele. Also, was ist los?

Wenn eine Variable einen einzelnen Verweis hat (wie $ var1, bevor sie als Argument für debug_zval_dump () verwendet wurde), optimiert die Engine von PHP die Art und Weise, wie sie an eine Funktion übergeben wird. Intern behandelt PHP $ var1 wie eine Referenz (indem der refcount für den Umfang dieser Funktion erhöht wird), mit der Einschränkung, dass, wenn die übergebene Referenz zufällig geschrieben wird, eine Kopie erstellt wird, aber nur zum Zeitpunkt des Schreibens . Dies wird als "Kopie beim Schreiben" bezeichnet.

Wenn also debug_zval_dump () zufällig in seinen einzigen Parameter geschrieben wird (und das nicht tut), wird eine Kopie erstellt. Bis dahin bleibt der Parameter eine Referenz, wodurch der Refcount für den Umfang des Funktionsaufrufs auf 2 erhöht wird.

- Credits gehen zum php Handbuch. Lesen Sie die gesamte Beschreibung, die mit der Funktion geliefert wird, und Sie sollten sie sogar gefragt haben.

--- Bearbeiten: Woops, ich sollte mehr Kommentare lesen, bevor ich antworte: D Wie auch immer, das ist die Antwort auf die Frage, wie schon erwähnt.

    
Jort van Breda 19.04.2011 18:02
quelle

Tags und Links