Cet article trie principalement les interfaces prédéfinies de PHP. Quatre interfaces sont couramment utilisées dans les projets quotidiens : IteratorAggregate (itérateur d'agrégation Iterator), Countable, ArrayAccess, Iterator. Les amis dans le besoin peuvent s'y référer
Il existe plusieurs interfaces prédéfinies en PHP, les quatre interfaces les plus couramment utilisées (IteratorAggregate (itérateur d'agrégation Iterator) , Countable, ArrayAccess, Iterator) vous seront respectivement présentés en détail.
Interface IteratorAggregate (itérateur d'agrégation Iterator)
IteratorAggregate extends Traversable { abstract public Traversable getIterator(void) }
Cette interface implémente une fonction - créer un itérateur externe Comment le comprendre spécifiquement ? 🎜>foreach pour parcourir un objet, si nous n'héritons pas de l'interface IteratorAggregate, toutes les propriétés publiques de l'objet seront parcourues (uniquement sous la forme de public $var). Si vous héritez de IteratorAggregate, l'objet renvoyé par la méthode getIterator implémentée dans la classe sera utilisé. Notez ici que l'objet renvoyé doit être un objet Traversable ou. étendre à partir de l'objet Traversable, sinon une exception sera levée
//看个例子 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
Interface dénombrable
Countable { abstract public int count(void) }
count sur un objet, si la fonction n'hérite pas de Countable, elle retournera toujours 1. Si elle hérite de Countable, il renverra le nombre implémenté renvoyé par la méthode count, regardez l'exemple suivant :
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
Interface 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 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
IteratorAggregate, cela peut être fait foreach:.
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
Interface de l'itérateur :
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) }
trratorAggregate (Documentation : Créer une interface d'itérateur externe, l'interface renvoie directement un itérateur) est similaire, mais ceci est implémenté dans la définition de la classe. Prenons un exemple :
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 => '燕睿涛'
Cela dit, je ne semble toujours pas me rendre compte de leur utilité, je vous suggère de jeter un œil à la source. code de Yii2. Un grand nombre de ces éléments sont utilisés dans le code source. Après l'avoir lu, vous vous sentirez progressivement : "Oh~ cela semble être vraiment utile..." ”
Comment obtenir la fonction URL de la page actuelle via PHP
Comment empêcher les utilisateurs d'accéder au code directement dans l'arrière-plan PHP Analyse
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!