ホームページ > バックエンド開発 > PHPの問題 > PHP の foreach でクラスをトラバースできるかどうかを検出する方法

PHP の foreach でクラスをトラバースできるかどうかを検出する方法

醉折花枝作酒筹
リリース: 2023-03-10 14:10:01
転載
1660 人が閲覧しました

この記事では、PHP の foreach でクラスをトラバースできるかどうかを検出する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHP の foreach でクラスをトラバースできるかどうかを検出する方法

PHP では、変数の型を簡単に判断できます。また、配列の長さを簡単に判断して、配列を走査できるかどうかを判断することもできます。授業についてはどうですか?このクラスが foreach を介して走査できるかどうかを確認するにはどうすればよいでしょうか?実際、PHP はすでに既製のインターフェイスを提供しています。

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
ログイン後にコピー

上記の例からわかるように、各 \$obj1 は Traversable で判断できないため、走査できません。 2 番目の $obj2 はイテレータ インターフェイスを実装しており、このオブジェクトは Traversable を通じて判断できます。 PHP マニュアルでは、Traversable インターフェイスは、クラスが foreach によってトラバースできるかどうかを検出するために使用されるインターフェイスです。

このインターフェイスにはいくつかの機能があります。

  1. このインターフェイスを実装する組み込みクラスは、IteratorAggregate または Iterator インターフェイスを実装しなくても、foreach を使用して走査できます。

  2. これは、PHP スクリプトでは実装できない内部エンジン インターフェイスです。代わりに、IteratorAggregate または Iterator インターフェイスを使用できます。

つまり、このインターフェイスは手動で実装する必要はなく、このインターフェイスの検証判定に合格するには、クラスにイテレータ関連のインターフェイスを実装するだけで済みます。このインターフェイスを単独で実装すると、エラーが報告され、IteratorAggregate または Iterator インターフェイスを実装するように求められます。

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

}
ログイン後にコピー

実際、前の記事では、オブジェクトが走査可能であることを確認しました。また、反復子インターフェイスを実装しなくても、foreach によってオブジェクトを走査できることを確認しました。すべてのパブリック プロパティを出力します。

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

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

// V:Obj1
// V:Obj2
// prv:Obj2
ログイン後にコピー

つまり、この Traversable インターフェイスの役割は、実際の使用では明らかではありません。私たちのほとんどは、クラスを横断できるかどうかを判断するためにこのインターフェイスを使用したことがないと思います。

しかし、上記の例から、出力する必要があるコンテンツをイテレーターでカスタマイズできることがわかります。比較的言えば、直接オブジェクトをトラバーサルするよりも柔軟で制御可能です。さらに、Traversable インターフェイスは、配列がオブジェクトに強制されているかどうかを判断できません。

$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;
}
ログイン後にコピー

実際、配列自体は自然な反復可能なオブジェクトです。ここでは型強制が行われていますが、実際には配列強制のオブジェクトをデフォルトでイテレータを実装したオブジェクトとみなした方が適切です。もちろん、このタイプのインターフェイスのより大きな重要性は、コードの仕様と必須の検査にあります。

テスト コード:

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
ログイン後にコピー

推奨学習: php ビデオ チュートリアル

以上がPHP の foreach でクラスをトラバースできるかどうかを検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート