Maison >développement back-end >tutoriel php >Analyse d'interface prédéfinie PHP

Analyse d'interface prédéfinie PHP

不言
不言original
2018-06-15 11:19:061569parcourir

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 //最后一个会报出Notice
L'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..." ”

Ce qui précède est le tout le contenu de cet article. J'espère qu'il sera utile à l'étude de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn