Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-vordefinierte Schnittstellenanalyse

PHP-vordefinierte Schnittstellenanalyse

不言
不言Original
2018-06-15 11:19:061481Durchsuche

In diesem Artikel werden hauptsächlich die vordefinierten Schnittstellen von PHP erläutert, die häufig in täglichen Projekten verwendet werden: IteratorAggregate (Aggregate-Iterator-Iterator), Countable, ArrayAccess und Iterator.

Es gibt mehrere vordefinierte Schnittstellen in PHP, die vier am häufigsten verwendeten Schnittstellen (IteratorAggregate (Aggregate Aggregate Iterator Iterator) , Countable, ArrayAccess, Iterator) werden Ihnen jeweils ausführlich vorgestellt.

IteratorAggregate (Aggregate-Iterator-Iterator)-Schnittstelle

IteratorAggregate extends Traversable {
 abstract public Traversable getIterator(void)
}

Diese Schnittstelle implementiert eine Funktion – das Erstellen eines externen Iterators im Einzelnen, wenn wir When verwenden foreach durchläuft ein Objekt. Wenn es die IteratorAggregate-Schnittstelle nicht erbt, durchläuft es alle öffentlichen Eigenschaften im Objekt (es kann nur in der Form einer öffentlichen $var vorliegen). Wenn Sie IteratorAggregate erben, wird das von der in der Klasse implementierten getIterator-Methode zurückgegebene Objekt verwendet. Beachten Sie hier, dass das zurückgegebene Objekt ein Traversable-Objekt sein muss vom Traversable-Objekt erweitern, andernfalls wird eine Ausnahme ausgelöst

//看个例子
class My{
 private $_data = [
 'a' => '燕睿涛',
 'b' => 'yanruitao',
 'c' => 'LULU',
 ];
 
 public function getIterator()
 {
 return new ArrayIterator($this->_data);
 }
}
$obj = new My;
foreach ($obj as $key => $value) {
 echo "$key => $value\n";
}
//输出结果为空 

class My implements IteratorAggregate {
 private $_data = [
 'a' => '燕睿涛',
 'b' => 'yanruitao',
 'c' => 'LULU',
 ];

 public function getIterator()
 {
 return new ArrayIterator($this->_data);
 }
}
$obj = new My;
foreach ($obj as $key => $value) {
 echo "$key => $value\n";
}
//结果:
a => 燕睿涛
b => yanruitao
c => LULU

Zählbare Schnittstelle

Countable {
 abstract public int count(void)
}

Diese Schnittstelle wird verwendet, um die Anzahl der Objekte zu zählen. Wie ist das konkret zu verstehen? Wenn wir count für ein Objekt aufrufen und die Funktion Countable nicht erbt, gibt sie immer 1 zurück. Wenn sie Countable wird der implementierte count zurückgegeben. Die von der -Methode zurückgegebene Zahl sehen Sie sich das folgende Beispiel an:

class CountMe
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
 return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable);
//返回1

class CountMe implements Countable
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
 return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable); 
//返回3


ArrayAccess接口
ArrayAccess {
 abstract public boolean offsetExists(mixed $offset)
 abstract public mixed offsetGet(mixed $offset)
 public void offsetSet(mixed $offset, mixed $value)
 public void offsetUnset(mixed $offset)
}


class CountMe
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
  return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable);
//返回1

class CountMe implements Countable
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
  return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable); 
//返回3

ArrayAccess-Schnittstelle

ArrayAccess {
 abstract public boolean offsetExists(mixed $offset)
    abstract public mixed offsetGet(mixed $offset)
    public void offsetSet(mixed $offset, mixed $value)
    public void offsetUnset(mixed $offset)
}

The Die Funktion dieser Schnittstelle besteht darin, uns den Zugriff wie auf ein Array-Objekt zu ermöglichen. Wie soll ich das ausdrücken? Ich denke, das bedeutet, dass PHP, wenn es während der lexikalischen Analyse ein Objekt verwendet, auf das Objekt zurückgreift, um herauszufinden, ob Wenn ja, führen Sie die entsprechenden Operationen aus (set, unset, isset, get), damit wir ein Array in der Klasse platzieren und die Klasse die grundlegenden Operationen des Arrays implementieren können:

class myObj
{
 
}
$obj = new myObj;
$obj['name'];
//Fatal error: Cannot use object of type myObj as array in 

class myObj implements ArrayAccess 
{
 public function offsetSet($offset, $value)
 {
  echo "offsetSet : {$offset} => {$value}\n";
 }

 public function offsetExists($offset)
 {
  echo "offsetExists : {$offset}\n";
 }

 public function offsetUnset($offset)
 {
  echo "offsetUnset : {$offset}\n";
 }

 public function offsetGet($offset)
 {
  echo "offsetGet : {$offset}\n";
 }
}
$obj = new myObj;
$obj[1] = '燕睿涛';
isset($obj['name']);
unset($obj['name']);
$obj['yrt'];

//输出结果:
offsetSet : 1 => 燕睿涛
offsetExists : name
offsetUnset : name
offsetGet : yrt

class myObj implements ArrayAccess 
{
 private $_data = [];
 public function offsetSet($offset, $value)
 {
  $this->_data[$offset] = $value;
 }

 public function offsetExists($offset)
 {
  return isset($this->_data[$offset]);
 }

 public function offsetUnset($offset)
 {
  unset($this->_data[$offset]);
 }

 public function offsetGet($offset)
 {
  return $this->_data[$offset];
 }
}

$obj = new myObj;
$obj['yrt'] = '燕睿涛';
var_dump($obj['yrt']);
var_dump(isset($obj['yrt']));
unset($obj['yrt']);
var_dump(isset($obj['yrt']));
var_dump($obj['yrt']);

//输出:
string(9) "燕睿涛"
bool(true)
bool(false)
Notice: Undefined index: yrt //最后一个会报出Notice

Das obige Objekt kann nur für grundlegende Array-Operationen verwendet werden, auch nicht für das Durchlaufen. Dies kann durch Kombinieren des vorherigen

IteratorAggregateforeach:

class myObj implements ArrayAccess, IteratorAggregate
{
private $_data = [];

 public function getIterator()
 {
  return new ArrayIterator($this->_data);
 }

 ......
}
$obj = new myObj;
$obj['yrt'] = '燕睿涛';
$obj[1] = '燕睿涛';
$obj['name'] = '燕睿涛';
$obj['age'] = 23;

foreach ($obj as $key => $value) {
 echo "{$key} => {$value}\n";
}
//输出:
yrt => 燕睿涛
1 => 燕睿涛
name => 燕睿涛
age => 23

Iterator-Schnittstelle:

Iterator extends Traversable {
    abstract public mixed current(void)
    abstract public scalar key(void)
    abstract public void next(void)
    abstract public void rewind(void)
    abstract public boolean valid(void)
}
Die Schnittstelle Ihres eigenen externen Iterators oder Ihrer eigenen Klasse ist tatsächlich immer noch schwer zu verstehen Ich bin der Meinung, dass die von dieser Schnittstelle implementierten Funktionen denen von

trratorAggregate

(Dokument: Erstellen einer externen Iteratorschnittstelle, die Schnittstelle gibt direkt einen Iterator zurück) ähneln, aber dies wird von selbst in der Klassendefinition implementiert Schauen Sie sich ein Beispiel an:

class myObj implements Iterator{

 private $_data = [];

 public function __construct(Array $arr)
 {
 $this->_data = $arr;
 }

 public function current()
 {
 return current($this->_data);
 }

 public function key()
 {
 return key($this->_data);
 }

 public function next()
 {
 next($this->_data);
 }

 public function rewind()
 {
 reset($this->_data);
 }

 public function valid()
 {
 return $this->key() !== NULL;
 }
}

$t = [
 'yrt' => '燕睿涛',
 'name' => '燕睿涛',
 false,
 '燕睿涛'
];
$obj = new myObj($t);

foreach ($obj as $key => $value) {
 echo "{$key} => ".var_export($value, true)."\n";
}
//输出:
yrt => '燕睿涛'
name => '燕睿涛'
0 => false
1 => '燕睿涛'
Das Obige bezieht sich auf einen Artikel von Bruder Niao über eine Testfrage (Iterator-Modus), aber das Urteil von Bruder Bird ist etwas fehlerhaft, wenn er auf einen falschen Wert stößt , es wird abgeschnitten

Zusammenfassung

Nachdem ich so viel geredet habe, schlage ich vor, dass Sie einen Blick auf viele dieser Dinge werfen Im Quellcode werden Sie nach und nach das Gefühl haben: „Oh, es scheint wirklich nützlich zu sein …“


Das Obige ist der gesamte Inhalt dieses Artikels . Das Lernen aller ist hilfreich. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

So erhalten Sie die aktuelle Seiten-URL-Funktion über PHP


So verhindern Sie, dass Benutzer das eingeben Code direkt in der PHP-Hintergrundanalyse

Das obige ist der detaillierte Inhalt vonPHP-vordefinierte Schnittstellenanalyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn