In PHP sind Arrays eine sehr leistungsstarke Datenstruktur, mit der verschiedene Arten von Elementen gespeichert werden können, einschließlich Zeichenfolgen, Ganzzahlen, Objekten, Ressourcen usw. In den meisten Fällen können Array -Tasten Zeichenfolgen oder Ganzzahlen sein, die auch der Schlüsseltyp sind, den wir üblicherweise verwenden. Wenn wir jedoch Objekte oder Ressourcen als Schlüssel für ein Array verwenden, können wir auf schwierige Fehler oder Verhaltensweisen stoßen, die die Erwartungen nicht entsprechen. In diesem Artikel werden die Probleme untersucht, die durch die Verwendung von Objekten oder Ressourcen als Arrayschlüssel in PHP verursacht werden können und Lösungen bereitstellen.
In PHP werden die Schlüssel eines Arrays von Hashing (Hash) verwaltet. Wenn wir Ganzzahlen oder Zeichenfolgen als Schlüssel verwenden, kann PHP Schlüssel direkt über den internen Hashing -Mechanismus verwalten. Wenn ein Objekt jedoch ein Array -Schlüssel ist, kann PHP den Wert des Objekts für Hash -Berechnungen nicht direkt verwenden, es sei denn, das Objekt implementiert die Methode __toString () oder eine spezielle Vergleichsmethode. Ohne diese Methoden verwendet PHP den Hash -Wert des Objekts als Array -Schlüssel, und dieser Hash -Wert repräsentiert nicht immer genau die Einzigartigkeit des Objekts.
<?php
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$obj1 = new Person("John");
$obj2 = new Person("Doe");
$array = [];
$array[$obj1] = "First object";
$array[$obj2] = "Second object";
// Mögliche Ausgabe:Array ( [Person Object] => Second object )
var_dump($array);
?>
Obwohl wir im obigen Beispiel unterschiedliche Objekte für $ OBJ1 und $ OBJ2 erstellen, kann PHP ihre Hash -Werte möglicherweise weiterhin als Schlüssel für das Array verwenden, was zu unerwartetem Verhalten führt.
Um dieses Problem zu lösen, wird empfohlen, eine eindeutige Kennung des Objekts (wie spl_object_hash () ) zu verwenden oder die Eigenschaften des Objekts in einen String -Typ (z.
<?php
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __toString() {
return $this->name;
}
}
$obj1 = new Person("John");
$obj2 = new Person("Doe");
$array = [];
$array[(string)$obj1] = "First object";
$array[(string)$obj2] = "Second object";
// Ausgabe:Array ( [John] => First object [Doe] => Second object )
var_dump($array);
?>
Durch die Implementierung der __ToString () -Methode können wir sicherstellen, dass jedes Objekt über eine eindeutige und erkennbare Zeichenfolgendarstellung verfügt, wodurch die oben genannten Probleme vermieden werden.
In PHP bezieht sich die Ressource normalerweise auf einen Verweis auf externe Ressourcen (z. B. Datenbankverbindungen, Dateihandles usw.). Der Ressourcentyp ist ein spezieller Datentyp in PHP, der selbst keine direkte Hash -Darstellung hat, und die Verwendung von Ressourcen als Array -Tasten kann zu Problemen führen.
Wenn Sie eine Ressource als Array -Taste verwenden, verfügt PHP befindet den Ressourceninhalt nicht direkt als Schlüssel. Stattdessen verwendet PHP die Kombination aus Typ und Identifikator der Ressource für Hashing. Da die Kennung der Ressource in verschiedenen PHP -Instanzen variieren kann, macht es dies unmöglich, die Daten der beiden Ressourcentypen effektiv zu vergleichen.
<?php
$resource1 = fopen("file1.txt", "r");
$resource2 = fopen("file2.txt", "r");
$array = [];
$array[$resource1] = "First resource";
$array[$resource2] = "Second resource";
// Dies kann Probleme verursachen,Weil Ressourcenidentifikatoren in verschiedenen Umgebungen variieren können
var_dump($array);
?>
Es wird empfohlen, keine Ressourcen als Schlüssel für Arrays zu verwenden, insbesondere wenn die Änderungen der Ressourcenkennung nicht klar sind. Wenn Sie Ressourcendaten verwenden müssen, sollten Sie in Betracht ziehen, die Ressource in einem Objekt zu verringern und dann das Objekt als Array -Schlüssel zu verwenden oder andere Datentypen zu verwenden, mit denen die Ressource (z. B. Ressourcen -ID oder andere String -Kenner) als Array -Schlüssel identifiziert werden können.
<?php
$resource1 = fopen("file1.txt", "r");
$resource2 = fopen("file2.txt", "r");
$array = [];
$array[(string)$resource1] = "First resource";
$array[(string)$resource2] = "Second resource";
var_dump($array);
?>
Auf diese Weise sorgt die String -Kennung der Ressource für die Einzigartigkeit der Arrayschlüssel.
Während PHP ermöglicht, dass Objekte und Ressourcen als Schlüssel für Arrays verwendet werden, kann diese Praxis aufgrund der Einschränkungen des Hashing -Mechanismus einige unerwartete Probleme aufwerfen. Um die Wartbarkeit und Stabilität des Codes zu gewährleisten, wird empfohlen:
Verwenden Sie Saiten oder Ganzzahlen als Schlüssel zu Arrays.
Wenn Sie ein Objekt verwenden müssen, können Sie in Betracht ziehen , die Methode __toString () zu implementieren oder mit spl_object_hash () eine eindeutige Darstellung des Objekts zu generieren.
Versuchen Sie, Ressourcen als Array -Schlüssel zu vermeiden. Wenn Sie sie verwenden möchten, wird empfohlen, Ressourcen in Objekte in Objekte zu integrieren oder die Kennung der Ressource als Array -Tasten zu verwenden.
Hoffentlich hilft Ihnen dieser Artikel, die Probleme und Lösungen zu verstehen, die sich aus der Verwendung von Objekten oder Ressourcen als Array -Schlüssel in PHP ergeben können. Wenn Sie mehr Fragen haben oder weitere Diskussionen benötigen, hinterlassen Sie bitte eine Nachricht und kommunizieren Sie!