Heim  >  Artikel  >  Backend-Entwicklung  >  So erkennen Sie, ob eine Klasse von foreach in PHP durchlaufen werden kann

So erkennen Sie, ob eine Klasse von foreach in PHP durchlaufen werden kann

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-06-10 17:15:531611Durchsuche

In diesem Artikel erfahren Sie, wie Sie erkennen, ob eine Klasse von foreach in PHP durchlaufen werden kann. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So erkennen Sie, ob eine Klasse von foreach in PHP durchlaufen werden kann

In PHP können wir leicht den Typ einer Variablen bestimmen und wir können auch leicht die Länge eines Arrays bestimmen, um festzustellen, ob das Array durchlaufen werden kann. Wie sieht es mit Unterricht aus? Woher wissen wir, ob diese Klasse durch foreach durchlaufen werden kann? Tatsächlich stellt uns PHP bereits eine vorgefertigte Schnittstelle zur Verfügung.

class Obj1
{
    public $v = 'V:Obj1';
    private $prv = 'prv:Obj1';
}

$obj1 = new Obj1();
echo $obj1 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // no

class Obj2 implements IteratorAggregate
{
    public $v = 'V:Obj2';
    private $prv = 'prv:Obj2';
    public function getIterator()
    {
        return new ArrayIterator([
            'v' => $this->v,
            'prv' => $this->prv,
        ]);
    }
}

$obj2 = new Obj2();
echo $obj2 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // yes

Wie aus dem obigen Beispiel ersichtlich ist, kann jedes $obj1 nicht durch Traversable beurteilt werden, sodass es nicht durchlaufen werden kann. Das zweite $obj2 implementiert die Iteratorschnittstelle, und dieses Objekt kann über Traversable beurteilt werden. Im PHP-Handbuch ist die Traversable-Schnittstelle die Schnittstelle, die verwendet wird, um zu erkennen, ob eine Klasse von foreach durchlaufen werden kann.

Diese Schnittstelle verfügt über mehrere Funktionen:

  1. Eingebaute Klassen, die diese Schnittstelle implementieren, können foreach zum Durchlaufen verwenden, ohne die IteratorAggregate- oder Iterator-Schnittstelle zu implementieren.

  2. Dies ist eine interne Engine-Schnittstelle, die nicht in PHP-Skripten implementiert werden kann. Stattdessen kann die Schnittstelle IteratorAggregate oder Iterator verwendet werden.

Das heißt, diese Schnittstelle erfordert nicht, dass wir sie manuell implementieren. Wir benötigen lediglich die Implementierung der iteratorbezogenen Schnittstelle durch unsere Klasse, um die Überprüfung dieser Schnittstelle zu bestehen. Wenn wir diese Schnittstelle alleine implementieren, wird ein Fehler gemeldet und wir werden aufgefordert, die IteratorAggregate- oder Iterator-Schnittstelle zu implementieren.

// Fatal error: Class ImplTraversable must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown 
class ImplTraversable implements Traversable{

}

Tatsächlich haben wir im vorherigen Artikel überprüft, dass das Objekt durchlaufen werden kann und dass es von foreach durchlaufen werden kann, ohne dass eine Iteratorschnittstelle implementiert werden muss. Es druckt alle öffentlichen Eigenschaften.

// foreach
foreach ($obj1 as $o1) {
    echo $o1, PHP_EOL;
}

foreach ($obj2 as $o2) {
    echo $o2, PHP_EOL;
}

// V:Obj1
// V:Obj2
// prv:Obj2

Das heißt, die Rolle dieser Traversable-Schnittstelle ist im tatsächlichen Gebrauch nicht offensichtlich. Ich glaube, dass die meisten von uns diese Schnittstelle noch nie verwendet haben, um festzustellen, ob eine Klasse durchlaufen werden kann.

Aber aus dem obigen Beispiel können wir sehen, dass Iteratoren den Inhalt anpassen können, den wir ausgeben müssen. Relativ gesehen ist es flexibler und kontrollierbarer als die direkte Objektdurchquerung. Darüber hinaus kann die Traversable-Schnittstelle keine Beurteilung vornehmen, ob das Array einem Objekt zugeordnet wird.

$arr = [1, 2, 3, 4];
$obj3 = (object) $arr;
echo $obj3 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // no

foreach ($obj3 as $o3) {
    echo $o3, PHP_EOL;
}

Tatsächlich ist das Array selbst ein natürliches iterierbares Objekt. Obwohl hier Typumwandlung durchgeführt wird, ist es tatsächlich angemessener, das Objekt der Array-Umsetzung als ein Objekt zu betrachten, das standardmäßig einen Iterator implementiert. Die größere Bedeutung dieser Art von Schnittstelle liegt natürlich in Code-Vorgaben und vorgeschriebenen Prüfungen.

Testcode:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/%E5%9C%A8PHP%E4%B8%AD%E6%A3%80%E6%B5%8B%E4%B8%80%E4%B8%AA%E7%B1%BB%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%A2%ABforeach%E9%81%8D%E5%8E%86.php

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo erkennen Sie, ob eine Klasse von foreach in PHP durchlaufen werden kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen