Heim > Artikel > Backend-Entwicklung > Ausführliche Erklärung des PHP-Zitats – Fallstricke und magische Verwendungsmöglichkeiten
Ich habe mich in letzter Zeit mit dem Thema „PHP-Zitate“ beschäftigt. Ich habe viele ausführliche Artikel gelesen und habe ein tieferes Verständnis für „Zitate“ in PHP.
Schauen Sie sich zunächst den folgenden Code an:
$foo['hello'] = '0'; $bar = &$foo['hello']; // 引用! $tipi = $foo; $tipi['hello'] = '1'; print_r($foo);
F: Ausgabe 0 oder Ausgabe 1? Die Antwort ist 1.
Was ist das Prinzip?
Der PHP-Kernel verwendet die zval
-Struktur zum Speichern von Variablen. Im PHP-Code verwenden wir die Funktion xdebug_debug_zval
, um dies herauszufinden.
Ändern Sie den obigen Code:
$foo['hello'] = '0'; xdebug_debug_zval('foo'); $bar = &$foo['hello']; // 引用! xdebug_debug_zval('foo'); $tipi = $foo; $tipi['hello'] = '1'; print_r($foo);
Die Ausgabe lautet wie folgt:
foo: (refcount=1, is_ref=0)=array ('hello' => (refcount=1, is_ref=0)='0') foo: (refcount=1, is_ref=0)=array ('hello' => (refcount=2, is_ref=1)='0')
$foo['hello']
wechselt von einer Nicht-Referenzvariablen (is_ref=0
) zu einer Referenzvariablen (is_ref=1
) und der Referenzzähler ist refcount=2
.
Warum ist das so?
Laut PHP: What References Do - Manual Erklärung:
$a =& $b;
Dies bedeutet, dass $a und $b auf dieselbe Variable verweisen.$a und $b sind hier genau gleich. Es ist nicht so, dass $a auf $b zeigt oder umgekehrt, sondern dass $a und $b auf die gleiche Stelle zeigen.
In Kombination mit unserem Beispiel, das heißt, wenn $bar = &$foo['hello'];
ausgeführt wird, werden sowohl $bar
als auch $foo['hello']
zu „Referenzvariablen“ und „zeigen auf die gleiche Stelle“.
Wenn wir dann dieses Array kopieren, kopieren wir auch die Referenz seines hello
-Elements; wenn $tipi['hello'] = '1';
ausgeführt wird, werden die „tipi['hello']
, $foo['hello']
und $bar
, auf die verwiesen wird, geändert gleicher Ort".
Der Wert von $foo['hello']
wird also natürlich zu 1
.
PHP, der ausführlich zitiert hat, hätte diese Syntax ausprobieren sollen:
for ($list as &$value) { $value = 'foo'; }
PHP wird Variablen nach der Kontrollstruktur nicht wiederverwenden, daher werde ich es hier nicht erklären; Die Grube kann also gerade erweitert werden.
$foo['hello'] = '0'; $foo['world'] = 'A'; foreach($foo as &$value) { // 引用! // Do nothing. } $tipi = $foo; $tipi['hello'] = '1'; $tipi['world'] = 'B'; print_r($foo);
Die Ausgabe hier ist wie folgt:
Array ( [hello] => 0 [world] => B )
hello
ist normal, während world
zu B
geändert wird! Der Grund kann durch Kombination der Funktion xdebug_debug_zval
ermittelt werden.
Es ist also eine gute Angewohnheit, einfach unset($value);
dabei zu bleiben.
Tatsächlich sind Anführungszeichen nicht nur Fallstricke. Es gibt immer noch große Vorteile.
Beispiel:
$catList = [ '1' => ['id' => 1, 'name' => '颜色', 'parent_id' => 0], '2' => ['id' => 2, 'name' => '规格', 'parent_id' => 0], '3' => ['id' => 3, 'name' => '白色', 'parent_id' => 1], '4' => ['id' => 4, 'name' => '黑色', 'parent_id' => 1], '5' => ['id' => 5, 'name' => '大', 'parent_id' => 2], '6' => ['id' => 6, 'name' => '小', 'parent_id' => 2], '7' => ['id' => 7, 'name' => '黄色', 'parent_id' => 1], ];
Wie konvertiere ich die obige Sequenztabelle in einen hierarchischen Baum?
In der Vergangenheit oder normalerweise war das erste, woran wir dachten, rekursives Backtracking.
Mit der Referenzfunktion von PHP kann die Zeitkomplexität jedoch auf O(n)
reduziert werden.
$treeData = []; foreach ($catList as $item) { if (isset($catList[$item['parent_id']]) && !empty($catList[$item['parent_id']])) { // 子分类 $catList[$item['parent_id']]['children'][] = &$catList[$item['id']]; } else { // 一级分类 $treeData[] = &$catList[$item['id']]; } } var_export($treeData);
Weitere PHP-bezogene technische Artikel finden Sie in der Spalte PHP-Tutorial, um mehr darüber zu erfahren!
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung des PHP-Zitats – Fallstricke und magische Verwendungsmöglichkeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!