Heim >Backend-Entwicklung >PHP-Tutorial >Kurze Analyse der PHP-SPL-Anwendung
Dieser Artikel stellt hauptsächlich die PHP-SPL-Anwendung vor und analysiert die sehr wichtigen, aber unbekannten Funktionen und zugehörigen Betriebsfähigkeiten von SPL in Form von Beispielen. Freunde in Not können sich darauf beziehen
Die Beispiele in diesem Artikel Beschreiben Sie die PHP-SPL-Anwendungsmethode. Ich möchte es als Referenz mit Ihnen teilen:
Der obige Artikel von Rafael Dohms hat mich so sehr überrascht, dass ich nicht anders konnte, als ihn zu übersetzen und einen Teil des Inhalts hinzuzufügen.
SPL, PHP-Standardbibliothek (Standard-PHP-Bibliothek), Eingebaute Komponenten und Schnittstellen seit PHP 5.0 und seit PHP5.3 schrittweise ausgereift. SPL ist tatsächlich in alle PHP5-Entwicklungsumgebungen integriert und erfordert keine Einrichtung.
Es scheint, dass viele PHP-Entwickler es im Grunde nicht verwenden oder überhaupt nicht davon gehört haben. Der Grund liegt in der schneeähnlichen Dokumentation, die dazu führt, dass man „seine Existenz“ ignoriert. SPL Dieses Juwel ist wie das „Herz des Ozeans“ der Titanic, das auf dem Meeresgrund versenkt wurde. Jetzt sollte es von uns aufgegriffen und an seinem rechtmäßigen Platz getragen werden, und dieser Standpunkt wird in diesem Artikel zum Ausdruck gebracht.
Also, Was bietet SPL?
SPL bietet Erweiterungen der PHP-Engine, wie z. B. Schnittstellen wie ArrayAccess, Countable und SeekableIterator , die verwendet werden Generieren Sie Daten in Array-Form. Operationsobjekt. Gleichzeitig können Sie auch andere Iteratoren wie RecursiveIterator und ArrayObejcts verwenden, um Daten zu iterieren.
Es verfügt außerdem über mehrere integrierte Objekte wie Exceptions, SplObserver, Spltorage und splautoloadregister, splclasses Die Hilfsfunktionen von , iteratorapply usw. werden verwendet, um die entsprechenden Funktionen zu überladen.
Diese Tools zusammen sind wie ein multifunktionales Schweizer Taschenmesser. Wenn man sie gut nutzt, kann man die Effizienz des PHP-Codes qualitativ verbessern. Wie können wir also seine Kraft freisetzen?
Überlast-Autoloader
Wenn Sie ein „Lehrbuchprogrammierer“ sind, wissen Sie garantiert, wie Sie __autoload
verwenden, um includes zu ersetzen /requires funktioniert, um die entsprechende Klasse langsam zu laden, oder?
Aber mit der Zeit werden Sie feststellen, dass Sie in Schwierigkeiten geraten sind. Zuerst müssen Sie sicherstellen, dass sich Ihre Klassendateien im angegebenen Dateipfad befinden. Im Zend-Framework müssen Sie beispielsweise „_“ verwenden. " um Klassen zu trennen. Methodenname (Wie lösen Sie dieses Problem?).
Ein weiteres Problem besteht darin, dass mit zunehmender Komplexität des Projekts auch die Logik darin __autoload
entsprechend komplex wird. Am Ende fügen Sie sogar eine Ausnahmebeurteilung hinzu und schreiben die gesamte Logik zum Laden von Klassen hinein.
Jeder weiß, dass „Eier nicht in einen Korb gelegt werden können“ und SPL verwendet werden kann, um die Ladelogik von __autoload
zu trennen. Schreiben Sie einfach Ihre eigene Autoload-Funktion und überladen Sie sie mit den von SPL bereitgestellten Funktionen.
Zum Beispiel können Sie bei dem oben erwähnten Zend-Framework-Problem die entsprechende Methode des Zend-Loaders überladen. Wenn die entsprechende Klasse nicht gefunden wird, wird die zuvor definierte Funktion verwendet.
<?php class MyLoader { public static function doAutoload($class) { // 本模块对应的 autoload 操作 } } spl_autoload_register( array('MyLoader', 'doAutoload') ); ?>
Wie Sie sehen, kann spl_autoload_register
auch mehrere Ladelogiken in Form eines Arrays hinzufügen. Gleichzeitig können Sie mit spl_autoload_unregister
auch nicht mehr benötigte Ladelogik entfernen. Diese Funktion wird immer verwendet.
Iterator
Iteration ist eines der häufigsten Entwurfsmuster und wird häufig für einheitliche Durchlaufvorgänge in einem Datensatz verwendet. Es ist keine Übertreibung zu sagen, dass SPL alle Iteratoren bereitstellt, die Sie für die entsprechenden Datentypen benötigen.
Ein sehr gutes Beispiel ist das Durchlaufen von Verzeichnissen. Der herkömmliche Ansatz besteht darin, scandir
zu verwenden und dann „.“ und „..“ sowie andere Dateien zu überspringen, die die Bedingungen nicht erfüllen. Wenn Sie beispielsweise ein Verzeichnis durchsuchen müssen, um Bilddateien zu extrahieren, müssen Sie feststellen, ob diese mit jpg oder gif enden.
Der folgende Code ist ein Beispiel für die Verwendung des SPL-Iterators zur Durchführung der oben genannten rekursiven Suche nach Bilddateien im angegebenen Verzeichnis:
<?php class RecursiveFileFilterIterator extends FilterIterator { // 满足条件的扩展名 protected $ext = array('jpg','gif'); /** * 提供 $path 并生成对应的目录迭代器 */ public function __construct($path) { parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path))); } /** * 检查文件扩展名是否满足条件 */ public function accept() { $item = $this->getInnerIterator(); if ($item->isFile() && in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) { return TRUE; } } } // 实例化 foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) { echo $item . PHP_EOL; } ?>
Man könnte sagen, ist hierfür nicht mehr Code erforderlich, um dasselbe zu tun? Wenn Sie sich also den obigen Code ansehen, haben Sie keinen hoch wiederverwendbaren und testbaren Code? :)
Hier sind andere von SPL bereitgestellte Iteratoren:
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIt-Erator
RecursiveCachingIterator
NorewindIterator
APPENDITERATOR
RecursiveIterator
Infiniteiterator
ReGexiterator
Emptyitrator
RecursiveTreeiterator
ArrayIterator
Zunächst mehr Iteratoren wird eingebaut. Ich denke, Sie können es ausprobieren. Vielleicht ändert es Ihre Gewohnheit, traditionellen Code zu schreiben.
SplFixedArray
SPL verfügt auch über eine Reihe integrierter Array-Manipulationstools. Sie können beispielsweise SplFixedArray verwenden, um ein Array mit fester Länge zu instanziieren. Warum also verwenden? Da es schneller ist, wirkt es sich sogar auf Ihr Gehalt aus :)
Wir wissen, dass reguläre PHP-Arrays verschiedene Arten von Schlüsseln wie Zahlen, Zeichenfolgen usw. enthalten und die Länge variabel ist. Gerade wegen dieser „erweiterten Funktionen“ verwendet PHP einen Hash, um den entsprechenden Wert über den Schlüssel zu erhalten – tatsächlich kann dies in bestimmten Situationen zu Leistungsproblemen führen.
Da SplFixedArray feste Zifferntasten verwendet, wird kein Hash-Speicher verwendet. Nicht ganz, man kann es sich sogar als C-Array vorstellen. Aus diesem Grund ist SplFixedArray schneller als normale Arrays (nur in PHP5.3).
Wie schnell ist es? Der folgende Datensatz kann Ihnen einen Einblick geben.
Wenn Sie viele Array-Operationen benötigen, können Sie es ausprobieren und ich glaube, es ist vertrauenswürdig.
Datenstruktur
Gleichzeitig bietet SPL auch die Implementierung einiger grundlegender Arten von Datenstrukturen. Obwohl wir traditionelle Variablentypen zur Beschreibung von Datenstrukturen verwenden können, wie zum Beispiel die Verwendung von Arrays zur Beschreibung von Stapeln (Strack) – und dann die entsprechenden Methoden pop und push (arraypop()
, arraypush()
) verwenden, müssen Sie jederzeit vorsichtig sein , weil Sie schließlich nicht speziell zur Beschreibung von Datenstrukturen entwickelt wurden – eine einzige Fehloperation kann den Stapel beschädigen.
Das SplStack-Objekt von SPL beschreibt Daten streng in Form eines Stapels und stellt entsprechende Methoden bereit. Gleichzeitig sollte ein solcher Code auch verstehen können, dass er auf einem Stapel und nicht auf einem Array ausgeführt wird, sodass Ihre Kollegen den entsprechenden Code besser verstehen können und er schneller ist.
Abschließend: Vielleicht reichen die oben genannten blassen Beispiele nicht aus, um Sie zur Verwendung von SPL zu „verleiten“. Übung bringt wahres Wissen und Sie müssen selbst immer leistungsfähigere Funktionen von SPL erkunden. Nur wenn es wie ein Edelstein langsam geschnitzt wird, kann es seinen Glanz erstrahlen.
Das obige ist der detaillierte Inhalt vonKurze Analyse der PHP-SPL-Anwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!