Heim > Backend-Entwicklung > PHP-Tutorial > Ausführliche Erklärung des PHP-Zitats – Fallstricke und magische Verwendungsmöglichkeiten

Ausführliche Erklärung des PHP-Zitats – Fallstricke und magische Verwendungsmöglichkeiten

步履不停
Freigeben: 2023-04-06 22:02:01
Original
3131 Leute haben es durchsucht

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.

0x00

Schauen Sie sich zunächst den folgenden Code an:

$foo['hello'] = '0';
$bar = &$foo['hello']; // 引用!
$tipi = $foo;
$tipi['hello'] = '1';

print_r($foo);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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')
Nach dem Login kopieren

$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.

0x01

PHP, der ausführlich zitiert hat, hätte diese Syntax ausprobieren sollen:

for ($list as &$value) {
    $value = 'foo';
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

Die Ausgabe hier ist wie folgt:

Array
(
    [hello] => 0
    [world] => B
)
Nach dem Login kopieren

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.

0x02

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],
];
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage