Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der PHP+SPL-Anwendungsfälle
Dieses Mal werde ich Ihnen eine detaillierte Erklärung der PHP+SPL-Anwendungsfälle geben. Was sind die Vorsichtsmaßnahmen für PHP+SPL-Anwendungen?
Der obige Artikel von Rafael Dohms hat mich so überrascht, dass ich nicht anders konnte, als ihn zu übersetzen und gleichzeitig etwas Inhalt 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 aufgenommen 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 /erfordert 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 gebräuchlichen 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 entsprechend dem Datentyp benötigen.
Ein sehr gutes Beispiel ist das Durchsuchen 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, dass dafür nicht mehr Code erforderlich ist Das Gleiche? Schauen Sie sich also den obigen Code an. Haben Sie nicht einen hochgradig wiederverwendbaren und testbaren Code? :)
Im Folgenden sind weitere von SPL bereitgestellte Iteratoren aufgeführt:
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator
Ab PHP5.3 wird es meiner Meinung nach mehr integrierte Iteratoren geben, die Sie vielleicht ausprobieren können. Gewohnheit.
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.
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!
Empfohlene Lektüre:
Detaillierte Erläuterung der Huffman-Kodierungs-/Dekodierungsschritte in PHP
PHP-Direkteinfügungs-Sortierfallanalyse
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP+SPL-Anwendungsfälle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!