《PHP應(yīng)用:PHP SPL標準庫之接口(Interface)詳解》要點:
本文介紹了PHP應(yīng)用:PHP SPL標準庫之接口(Interface)詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP SPL尺度庫總共有6個接口,如下:PHP學(xué)習(xí)
1.Countable
2.OuterIterator
3.RecursiveIterator
4.SeekableIterator
5.SplObserver
6.SplSubjectPHP學(xué)習(xí)
其中OuterIterator、RecursiveIterator、SeekableIterator都是繼承Iterator類的,下面會對每種接口作用和使用進行詳細闡明.PHP學(xué)習(xí)
Coutable接口:PHP學(xué)習(xí)
實現(xiàn)Countable接口的對象可用于count()函數(shù)計數(shù).
PHP學(xué)習(xí)
代碼如下:
class Mycount implements Countable
{
??? public function count()
??? {
??????? static $count = 0;
??????? $count++;
??????? return $count;
??? }
}
?
$count = new Mycount();
$count->count();
$count->count();
?
echo count($count); //3
echo count($count); //4
闡明:PHP學(xué)習(xí)
調(diào)用count()函數(shù)時,Mycount::count()辦法被調(diào)用
count()函數(shù)的第二個參數(shù)將不會產(chǎn)生影響PHP學(xué)習(xí)
OuterIterator接口:PHP學(xué)習(xí)
自定義或修改迭代過程.
PHP學(xué)習(xí)
代碼如下:
//IteratorIterator是OuterIterator的一個實現(xiàn)類
class MyOuterIterator extends? IteratorIterator {
?
??? public function current()
??? {
??????? return parent::current() . 'TEST';
??? }
}
?
foreach(new MyOuterIterator(new ArrayIterator(['b','a','c'])) as $key => $value) {
??? echo "$key->$value".PHP_EOL;
}
/*
成果:
0->bTEST
1->aTEST
2->cTEST
*/
在實際運用中,OuterIterator極其有用:PHP學(xué)習(xí)
代碼如下:
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'mckee');
$db->query('set names utf8');
$pdoStatement = $db->query('SELECT * FROM test1', PDO::FETCH_ASSOC);
$iterator = new IteratorIterator($pdoStatement);
$tenRecordArray = iterator_to_array($iterator);
print_r($tenRecordArray);
RecursiveIterator接口:
用于循環(huán)迭代多層結(jié)構(gòu)的數(shù)據(jù),RecursiveIterator另外提供了兩個辦法:PHP學(xué)習(xí)
RecursiveIterator::getChildren 獲取當前元素下子迭代器
RecursiveIterator::hasChildren 判斷當前元素下是否有迭代器PHP學(xué)習(xí)
代碼如下:
class MyRecursiveIterator implements RecursiveIterator
{
??? private $_data;
??? private $_position = 0;
?
??? public function __construct(array $data) {
??????? $this->_data = $data;
??? }
?
??? public function valid() {
??????? return isset($this->_data[$this->_position]);
??? }
?
??? public function hasChildren() {
??????? return is_array($this->_data[$this->_position]);
??? }
?
??? public function next() {
??????? $this->_position++;
??? }
?
??? public function current() {
??????? return $this->_data[$this->_position];
??? }
?
??? public function getChildren() {
??????? print_r($this->_data[$this->_position]);
??? }
?
??? public function rewind() {
??????? $this->_position = 0;
??? }
?
??? public function key() {
??????? return $this->_position;
??? }
}
?
$arr = array(0, 1=> array(10, 20), 2, 3 => array(1, 2));
$mri = new MyRecursiveIterator($arr);
?
foreach ($mri as $c => $v) {
??? if ($mri->hasChildren()) {
??????? echo "$c has children: " .PHP_EOL;
??????? $mri->getChildren();
??? } else {
??????? echo "$v" .PHP_EOL;
??? }
?
}
/*
成果:
0
1 has children:
Array
(
??? [0] => 10
??? [1] => 20
)
2
3 has children:
Array
(
??? [0] => 1
??? [1] => 2
)
*/
SeekableIterator接口:PHP學(xué)習(xí)
通過seek()辦法實現(xiàn)可搜索的迭代器,用于搜索某個位置下的元素.
PHP學(xué)習(xí)
代碼如下:
class? MySeekableIterator? implements? SeekableIterator? {
?
??? private? $position = 0;
?
??? private? $array? = array(
??????? "first element" ,
??????? "second element" ,
??????? "third element" ,
??????? "fourth element"
??? );
?
??? public function? seek ( $position ) {
??????? if (!isset( $this -> array [ $position ])) {
??????????? throw new? OutOfBoundsException ( "invalid seek position ( $position )" );
??????? }
?
?????? $this -> position? =? $position ;
??? }
?
??? public function? rewind () {
??????? $this -> position? =? 0 ;
??? }
?
??? public function? current () {
??????? return? $this -> array [ $this -> position ];
??? }
?
??? public function? key () {
??????? return? $this -> position ;
??? }
?
??? public function? next () {
??????? ++ $this -> position ;
??? }
?
??? public function? valid () {
??????? return isset( $this -> array [ $this -> position ]);
??? }
}
?
try {
?
??? $it? = new? MySeekableIterator ;
??? echo? $it -> current (),? "\n" ;
?
??? $it -> seek ( 2 );
??? echo? $it -> current (),? "\n" ;
?
??? $it -> seek ( 1 );
??? echo? $it -> current (),? "\n" ;
?
??? $it -> seek ( 10 );
?
} catch ( OutOfBoundsException $e ) {
??? echo? $e -> getMessage ();
}
/*
結(jié)果:
first element
third element
second element
invalid seek position ( 10 )
*/
SplObserver和SplSubject接口:
SplObserver和SplSubject接口用來實現(xiàn)觀察者設(shè)計模式,觀察者設(shè)計模式是指當一個類的狀態(tài)發(fā)生變化時,依賴它的對象都會收到通知并更新.使用場景非常廣泛,好比說當一個事件發(fā)生后,需要更新多個邏輯操作,傳統(tǒng)方式是在事件添加后編寫邏輯,這種代碼耦合并難以維護,觀察者模式可實現(xiàn)低耦合的通知和更新機制.
看看SplObserver和SplSubject的接口結(jié)構(gòu):
PHP學(xué)習(xí)
代碼如下:
//SplSubject布局 被觀察的對象
interface SplSubject{
??? public function attach(SplObserver $observer); //添加觀察者
??? public function detach(SplObserver $observer); //剔除觀察者
??? public function notify(); //通知觀察者
}
?
//SplObserver布局 代表觀察者
interface SplObserver{
??? public function update(SplSubject $subject); //更新操作
}
看下面一個實現(xiàn)觀察者的例子:PHP學(xué)習(xí)
代碼如下:
class Subject implements SplSubject
{
??? private $observers = array();
?
??? public function attach(SplObserver? $observer)
??? {
??????? $this->observers[] = $observer;
??? }
?
??? public function detach(SplObserver? $observer)
??? {
??????? if($index = array_search($observer, $this->observers, true)) {
??????????? unset($this->observers[$index]);
??????? }
??? }
?
??? public function notify()
??? {
??????? foreach($this->observers as $observer) {
??????????? $observer->update($this);
??????? }
??? }
?
?
}
?
class Observer1 implements? SplObserver
{
??? public function update(SplSubject? $subject)
??? {
??????? echo "邏輯1代碼".PHP_EOL;
??? }
}
?
class Observer2 implements? SplObserver
{
??? public function update(SplSubject? $subject)
??? {
??????? echo "邏輯2代碼".PHP_EOL;
??? }
}
?
?
$subject = new Subject();
$subject->attach(new Observer1());
$subject->attach(new Observer2());
?
$subject->notify();
/*
成果:
邏輯1代碼
邏輯2代碼
*/
《PHP應(yīng)用:PHP SPL標準庫之接口(Interface)詳解》是否對您有啟發(fā),歡迎查看更多與《PHP應(yīng)用:PHP SPL標準庫之接口(Interface)詳解》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/10917.html