PHP FilterIterator可以在迭代器輸出內(nèi)容前進(jìn)行篩選處理。當(dāng)我們需要按照特定的規(guī)則來篩選輸出內(nèi)容時(shí),就可以使用PHP FilterIterator來完成這個(gè)任務(wù)。
下面我們舉一個(gè)簡(jiǎn)單的例子來演示PHP FilterIterator的用法:
class MyIterator extends FilterIterator { public function accept() { $current = $this->getInnerIterator()->current(); return ($current % 2 == 0); } } $array = new ArrayIterator(array(1, 2, 3, 4, 5, 6)); $iterator = new MyIterator($array); foreach ($iterator as $key =>$value) { echo "{$key} =>{$value}\n"; }
上面的代碼中,我們定義了一個(gè)MyIterator類,繼承了PHP內(nèi)置的FilterIterator,并且重寫了accept()方法。accept()方法用來判斷當(dāng)前迭代器的內(nèi)容是否滿足條件,如果滿足條件就返回true,否則返回false。在這個(gè)例子中,我們定義了一個(gè)奇偶性的篩選規(guī)則,只有當(dāng)?shù)鞯膬?nèi)容是偶數(shù)才會(huì)輸出到屏幕上。
下面我們?cè)賮砜匆粋€(gè)更加具體的例子,假設(shè)我們有一個(gè)從數(shù)據(jù)庫里面讀數(shù)據(jù)的迭代器,我們想要將用戶的密碼字段篩選出來,在輸出之前進(jìn)行加密處理,那么就可以使用PHP FilterIterator來完成。
class UserPasswordFilter extends FilterIterator { public function current() { $password = $this->getInnerIterator()->current()->password; return password_hash($password, PASSWORD_DEFAULT); } public function accept() { return property_exists($this->getInnerIterator()->current(), 'password'); } } $pdo = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'my_user', 'my_password'); $iterator = new ArrayIterator($pdo->query('SELECT * FROM users')); foreach (new UserPasswordFilter($iterator) as $user) { echo $user->password; }
在這個(gè)例子中,我們定義了一個(gè)UserPasswordFilter類,繼承了PHP內(nèi)置的FilterIterator,并且重寫了current()方法和accept()方法。current()方法用來返回當(dāng)前迭代器的內(nèi)容,我們?cè)诜祷刂皩?duì)密碼字段進(jìn)行了加密處理。accept()方法用來判斷當(dāng)前迭代器的內(nèi)容是否滿足條件,只有當(dāng)當(dāng)前內(nèi)容中存在password屬性時(shí)才返回true。
PHP FilterIterator的使用非常靈活,可以根據(jù)實(shí)際需求進(jìn)行定制化編寫篩選規(guī)則。但是需要注意的是,F(xiàn)ilterIterator并不是對(duì)原有迭代器進(jìn)行修改,而是創(chuàng)建了一個(gè)新的迭代器。因此,在使用完FilterIterator后一定要記得銷毀。