Maison >développement back-end >tutoriel php >Analyse d'interface prédéfinie PHP
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) }Cette interface est utilisée pour compter les nombre d'objets. En quoi est-ce spécifique ? Comprenez, quand on appelle
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) }La fonction de cette interface est Permet d'accéder à des objets comme accéder à des tableaux. Comment dire cela ? Je suppose que cela signifie que si PHP rencontre un tableau lors de l'utilisation d'un objet lors d'une analyse lexicale, il reviendra à l'objet pour savoir si ArrayAccess est implémenté. Si c'est le cas, procédez aux opérations correspondantes (set, unset, isset, get), afin que nous puissions placer un tableau dans la classe et laisser la classe implémenter les opérations de base du tableau. exemple :
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 //最后一个会报出NoticeL'objet ci-dessus Il ne peut s'agir que d'opérations de base sur un tableau, pas même de traversée. Combiné avec le précédent
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) }Vous pouvez itérer votre propre itérateur externe ou interface de classe en interne. C'est l'explication donnée par le document officiel It. est encore difficile à comprendre à première vue. En fait, j'ai l'impression que les fonctions implémentées par cette interface sont similaires à
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 => '燕睿涛'Ce qui précède, je fais référence à un article de frère Niao sur une question test (mode itérateur), mais le jugement de validité de frère Niao est un peu imparfait. Lorsqu'il rencontre une valeur fausse, il sera tronqué Résumé
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!