この記事では主に PHP SPL の応用を紹介し、非常に重要だが知られていない SPL の機能と関連する操作スキルをサンプルの形で分析します。 PHP SPL。詳細は以下のとおりです:
Rafael Dohms 上記の記事は私を非常に驚かせたので、翻訳し、同時にいくつかの内容を追加しました。
SPL、PHP標準ライブラリ(標準PHPライブラリ)、
PHP 5.0から組み込まれたコンポーネントとインターフェース、PHP5.3から徐々に成熟してきました。 SPL は実際にはすべての PHP5 開発環境に組み込まれており、セットアップは必要ありません。多くの PHP 開発者は基本的に PHP を使用していないか、聞いたことさえないようです。その理由は、「存在」を無視してしまう雪のような文書にあります。 SPL この宝石は、海底に沈んだタイタニック号の「海の心臓」のようなものです。今、それは私たちによって手に取られ、しかるべき場所で着用されるべきであり、これがこの記事で表現された観点です。
それでは、
SPL は何を提供するのでしょうか?SPL は、配列形式でオブジェクトを操作するために使用される
ArrayAccess、Countable 、SeekableIterator などのインターフェイスを使用して PHP エンジンを拡張します。同時に、RecursiveIterator、ArrayObjects、その他のイテレータを使用してデータを反復することもできます。 また、対応する関数をオーバーロードするための、
Exceptions、SplObserver、Spltorage、splautoloadregister、splclasses、iteratorapplyなどのいくつかのオブジェクト用のヘルパー関数も組み込まれています。 これらのツールを組み合わせると、多機能のスイス アーミー ナイフのようなものになります。これらをうまく活用すると、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('MyLoader', 'doAutoload') ); ?>
正如你所见, spl_autoload_register
还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl_autoload_unregister
移除已经不再需要的载入逻辑,这功能总会用到的。
迭代器
迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。
有个非常好的案例就是遍历目录。常规的做法就是使用 scandir
requires
もう 1 つの問題は、プロジェクトがますます複雑になるにつれて、__autoload
内のロジックもそれに応じて複雑になることです。最終的には、例外判定も追加し、クラスをロードするロジックをすべて書き込むことになります。
「卵は 1 つのカゴに入れることができない」ことは誰もが知っています。SPL を使用して __autoload
の読み込みロジックを分離できます。独自の自動ロード関数を作成し、SPL が提供する関数を使用してそれをオーバーロードするだけです。
<?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;
}
?>
spl_autoload_register
は配列の形式で複数の読み込みロジックを追加することもできます。同時に、spl_autoload_unregister
を使用して、不要になったロード ロジックを削除することもできます。この機能は常に使用されます。 🎜🎜🎜Iterator🎜🎜🎜反復は一般的な設計パターンの 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
since P HP5.3最初は、より多くのイテレーターが組み込まれます。おそらく、従来のコードを書く習慣が変わると思います。
SplFixedArray
SPL には、一連の組み込み配列操作ツールもあります。たとえば、SplFixedArray を使用して固定長配列をインスタンス化できます。では、なぜそれを使用するのでしょうか?高速なため、給与にも影響します:)
PHP の通常の配列には、数値や文字列などのさまざまなタイプのキーが含まれており、長さは可変であることがわかっています。 PHP がハッシュを使用してキーを通じて対応する値を取得するのは、これらの「高度な機能」のためです。実際、これにより、特定の状況でパフォーマンスの問題が発生する可能性があります。
SplFixedArray は固定数値キーを使用するため、ハッシュ ストレージを使用しません。正確にはそうではありませんが、C 配列と考えることもできます。これが、SplFixedArray が通常の配列より高速である理由です (PHP5.3 のみ)。
どのくらいの速さですか? 以下の一連のデータからそれを垣間見ることができます。
多くの配列操作が必要な場合は、試してみてください。信頼できると思います。
データ構造
同時に、SPL はいくつかの基本的なタイプのデータ構造の実装も提供します。配列を使用してスタック (Strack) を記述するなど、従来の変数型を使用してデータ構造を記述することはできますが、対応するメソッド Pop および Push (arraypop()
、arraypush()
) を使用することもできますが、常に注意する必要があります。データ構造を記述するために特に使用されるわけではありません。間違った操作を行うとスタックが破壊される可能性があります。
SPL の SplStack オブジェクトは、厳密にデータをスタック形式で記述し、対応するメソッドを提供します。同時に、そのようなコードは、配列ではなくスタック上で動作していることも理解できる必要があり、ピアが対応するコードをよりよく理解できるようになり、処理が高速化されます。
最後に、おそらく上記の淡い例は、SPL を使用するように「誘惑」するには十分ではありません。実践することで真の知識が得られ、SPL のさらに強力な機能を自分で探索する必要があります。宝石のようにゆっくりと彫られて初めて輝きを放ちます。
以上がPHP SPL アプリケーションの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。