ホームページ  >  記事  >  バックエンド開発  >  PHP+SPLの活用事例を詳しく解説

PHP+SPLの活用事例を詳しく解説

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-16 15:23:482144ブラウズ

今回は、PHP+SPLアプリケーションの注意事項について詳しく説明します。以下は実際のケースです。

Rafael Dohms による上記の記事は私を非常に驚かせたので、翻訳せずにはいられず、同時にいくつかのコンテンツを追加しました。

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

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

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

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

また、対応する関数をオーバーロードするための、ExceptionsSplObserverSpltoragesplautoloadregistersplclassesiteratorapplyなどのいくつかのオブジェクト用のヘルパー関数も組み込まれています。

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

オーバーロードオートローダー

あなたが「教科書プログラマー」であれば、autoload を使用して autoload 去代替 includes/requires 操作惰性载入对应的类,对不?

但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用「_」来分割类、方法名称(你如何解决这一问题?)。

另外的一个问题,就是当项目变得越来越复杂, autoload 内的逻辑也会变得相应的复杂。到最后,甚至你会加入异常判断,以及将所有的载入类的逻辑如数写到其中。

大家都知道「鸡蛋不能放到一个篮子中」,利用 SPL 可以分离 autoload 的载入逻辑。只需要写个你自己的 autoload 函数,然后利用 SPL 提供的函数重载它。

例如上述 Zend 框架的问题,你可以重载 Zend loader 对应的方法,如果它没有找到对应的类,那么就使用你先前定义的函数。

<?php
class MyLoader {
  public static function doAutoload($class) {
    // 本模块对应的 autoload 操作
  }
}
spl_autoload_register( array(&#39;MyLoader&#39;, &#39;doAutoload&#39;) );
?>

正如你所见, spl_autoload_register 还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl_autoload_unregister 移除已经不再需要的载入逻辑,这功能总会用到的。

迭代器

迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。

有个非常好的案例就是遍历目录。常规的做法就是使用 scandir includes

/

requires

を置き換えて、対応する遅延読み込みクラスを操作する方法を必ず知っているでしょう。 、 右?

しかし、時間が経つと、まず、クラス ファイルが指定されたファイル パスに存在することを確認する必要があります。たとえば、Zend フレームワークでは、クラスを区切るのに「_」を使用する必要があります。およびメソッド名 (「この問題を解決するにはどうすればよいですか?」)。 🎜🎜もう 1 つの問題は、プロジェクトがますます複雑になるにつれて、autoload 内のロジックもそれに応じて複雑になることです。最終的には、例外判定も追加し、クラスをロードするロジックをすべて書き込むことになります。 🎜🎜「卵は 1 つのカゴに入れることができない」ことは誰もが知っています。SPL を使用して autoload の読み込みロジックを分離できます。独自の自動ロード関数を作成し、SPL が提供する関数を使用してそれをオーバーロードするだけです。 🎜🎜たとえば、上記の Zend フレームワークの問題では、対応するクラスが見つからない場合は、Zend ローダーの対応するメソッドをオーバーロードできます。以前に定義した関数が使用されます。 🎜
<?php
class RecursiveFileFilterIterator extends FilterIterator {
  // 满足条件的扩展名
  protected $ext = array(&#39;jpg&#39;,&#39;gif&#39;);
  /**
   * 提供 $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(&#39;/path/to/something&#39;) as $item) {
  echo $item . PHP_EOL;
}
?>
🎜 ご覧のとおり、spl_autoload_register は配列の形式で複数の読み込みロジックを追加することもできます。同時に、spl_autoload_unregister を使用して、不要になったロード ロジックを削除することもできます。この機能は常に使用されます。 🎜🎜🎜イテレータ🎜🎜🎜イテレーションは、一般的なデザイン パターン🎜の 1 つであり、のデータ セットの統合トラバーサル操作。 SPL は、データ型 🎜 に対応する必要なイテレータをすべて提供していると言っても過言ではありません。 🎜🎜非常に良い例は、ディレクトリの走査🎜です。従来のアプローチでは、scandir を使用し、「.」と「..」、および条件を満たさないその他のファイルをスキップします。たとえば、画像ファイルを抽出するためにディレクトリを移動する必要がある場合、画像ファイルが jpg で終わるか gif で終わるかを判断する必要があります。 🎜🎜次のコードは、SPL のイテレータを使用して上記の再帰を実行し、指定されたディレクトリで画像ファイルを検索する例です: 🎜rrreee🎜同じことを行うのに、より多くのコードが必要ではないかと思われるかもしれません。では、上記のコードを見てください。再利用可能でテストしやすいコードではないでしょうか :)🎜

以下は SPL によって提供される他のイテレータです:

RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator

PHP5.3 からは、さらに多くのイテレータが組み込まれる予定です。おそらく、従来のコードを書く習慣を変えることができると思います。

SplFixedArray

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

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

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

どのくらいの速さですか? 以下の一連のデータからそれを垣間見ることができます。

多くの配列操作が必要な場合は、試してみてください。信頼できると思います。

データ構造

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

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

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

PHP でハフマンエンコーディング/デコーディングを実装する手順の詳細な説明

PHP 直接挿入ソートケース分析

以上がPHP+SPLの活用事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。