ホームページ  >  記事  >  バックエンド開発  >  PHP の忘れられた宝石 SPL_PHP チュートリアル

PHP の忘れられた宝石 SPL_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:29:16899ブラウズ

Rafael Dohms による上記の記事は私を非常に驚かせたので、翻訳して内容を追加せずにはいられませんでした。

SPL、PHP 標準ライブラリ (標準 PHP ライブラリ) は、PHP 5.0 から始まる組み込みコンポーネントおよびインターフェイスであり、PHP 5.3 から徐々に成熟してきました。 SPL は実際にはすべての PHP5 開発環境に組み込まれており、セットアップは必要ありません。

多くの PHP 開発者は基本的にこれを使用していないか、聞いたことさえないようです。その理由は、「存在」を無視してしまう雪のような文書にあります。 SPL この宝石は、海底に沈んだタイタニック号の「海の心臓」のようなものです。今、それは私たちによって手に取られ、しかるべき場所で着用されるべきであり、これがこの記事で表現されている観点です。

では、SPL は何を提供するのでしょうか?

SPL は、オブジェクトを配列として操作するために使用される ArrayAccess、Countable、SeekableIterator などのインターフェイスを使用して PHP エンジンを拡張します。同時に、RecursiveIterator や ArrayObjects などの他のイテレータを使用してデータを反復することもできます。

また、対応する関数をオーバーロードするための、Exceptions、SplObserver、Spltorage および splautoloadregister、splclasses、iteratorapply などのいくつかのオブジェクト用のヘルパー関数も組み込まれています。

これらのツールを組み合わせると、多機能のスイス アーミー ナイフのようなものになります。これらをうまく活用すると、PHP コードの効率が定性的に向上します。では、どうすればその力を発揮できるのでしょうか?

オートローダーをリロードします

あなたが「教科書的なプログラマー」であれば、__autoload を使用して include/requires 操作を置き換えて、対応するクラスを遅延ロードする方法を知っているはずですよね?

しかし、時間が経つにつれて、まず、クラス ファイルが指定されたファイル パスに存在する必要があることを確認する必要があります。たとえば、Zend フレームワークでは、クラスとクラスを区切るために「_」を使用する必要があります。メソッド名 (この問題をどうやって解決しますか? この問題は?)。

もう 1 つの問題は、プロジェクトがますます複雑になるにつれて、__autoload 内のロジックもそれに応じて複雑になることです。最終的には、例外判定も追加し、クラスをロードするロジックをすべて書き込むことになります。

「卵は 1 つのカゴに入れることができない」ことは誰もが知っており、SPL を使用して __autoload の読み込みロジックを分離できます。独自の自動ロード関数を作成し、SPL が提供する関数を使用してそれをオーバーロードするだけです。

たとえば、上記の Zend フレームワークの問題では、対応するクラスが見つからない場合は、Zend ローダーの対応するメソッドをオーバーロードできます。その後、以前に定義した関数が使用されます。

リーリー

ご覧のとおり、spl autoload register は、配列の形式で複数のロード ロジックを追加することもできます。同時に、spl autoload unregister を使用して、不要になった読み込みロジックを削除することもできます。この機能は常に使用されます。

イテレータ

反復は、一連のデータ内の統一された走査操作に一般的に使用される一般的な設計パターンの 1 つです。 SPL は、対応するデータ型に必要なイテレータをすべて提供すると言っても過言ではありません。

非常に良い例は、ディレクトリの走査です。従来のアプローチでは、scandir を使用し、「.」と「..」、および条件を満たさないその他のファイルをスキップします。たとえば、画像ファイルを抽出するためにディレクトリを移動する必要がある場合、画像ファイルが jpg で終わるか gif で終わるかを判断する必要があります。

次のコードは、SPL のイテレータを使用して上記の再帰を実行し、指定されたディレクトリで画像ファイルを検索する例です。 れーれー


同じことを行うのに、より多くのコードが必要になるのではないか、と思われるかもしれません。では、上記のコードを見てください。再利用可能でテストしやすいコードではないでしょうか :)

SPL が提供する他のイテレータは次のとおりです:

    RecursiveIterator
  • RecursiveIteratorIterator
  • OuterIterator
  • IteratorIterator
  • FilterIterator
  • RecursiveFilterIterator
  • ParentIterator
  • SeekableIterator
  • LimitIterator
  • GlobIterator
  • CachingIterator
  • Recurs iveCachingIterator
  • NoRewindIterator
  • AppendIterator
  • RecursiveIteratorIterator
  • InfiniteIterator
  • RegexIterator
  • RecursiveRegexIterator
  • EmptyIterator
  • RecursiveTreeIterator
  • ArrayIterator
  • PHP5.3 からは、さらに多くの組み込みイテレーターが追加されるので、これを試してみると、従来のコードを書く習慣が変わるかもしれません。

    SplFixedArray

    SPL には一連の組み込み配列操作ツールもあります。たとえば、SplFixedArray を使用して固定長配列をインスタンス化できます。では、なぜそれを使うのでしょうか?なぜなら、そのほうが早いし、給料にも影響するからです:)

    PHP の通常の配列には、数値、文字列などのさまざまなタイプのキーが含まれており、長さは可変であることがわかっています。 PHP がハッシュを使用してキーを通じて対応する値を取得するのは、これらの「高度な機能」のためです。実際、これにより、特定の状況でパフォーマンスの問題が発生する可能性があります。

    SplFixedArray は固定数値キーを使用するため、ハッシュ ストレージを使用しません。正確にはそうではありませんが、C 配列と考えることもできます。これが、SplFixedArray が通常の配列より高速である理由です (PHP5.3 のみ)。

    では、どの程度の速度なのかは、次のデータで一目瞭然です。


    多くの配列操作が必要な場合は、それを試してみて、それが信頼できると確信できます。

    データ構造

    同時に、SPL はいくつかの基本的なタイプのデータ構造の実装も提供します。配列を使用してスタック (Strack) を記述するなど、従来の変数型を使用してデータ構造を記述することはできますが、対応するポップとプッシュのメソッド (arraypop()、arraypush()) を使用する必要があります。結局のところ、それらはデータ構造を記述するように特別に設計されていないため、常に注意してください。1 つの間違った操作によってスタックが破壊される可能性があります。

    SPL の SplStack オブジェクトは、データをスタックの形式で厳密に記述し、対応するメソッドを提供します。同時に、そのようなコードは、配列ではなくスタック上で動作していることも理解できる必要があり、ピアが対応するコードをよりよく理解できるようになり、処理が高速化されます。

    最後に、おそらく上記の淡い例は、SPL を使用する「誘惑」には十分ではありません。実践することで真の知識が得られ、SPL のさらに強力な機能を自分で探索する必要があります。宝石のようにゆっくりと彫られて初めて輝きを放ちます。

    www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/777572.html技術記事 Rafael Dohms による上記の記事は私を非常に驚かせたので、翻訳して内容を追加せずにはいられませんでした。 SPL、PHP 標準ライブラリ (標準 PHP ライブラリ)、PHP 5.0 以降...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。