>  기사  >  백엔드 개발  >  PHP에서 foreach로 클래스를 탐색할 수 있는지 여부를 감지하는 방법

PHP에서 foreach로 클래스를 탐색할 수 있는지 여부를 감지하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-06-10 17:15:531609검색

이 글에서는 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로 판단할 수 없으므로 순회할 수 없습니다. 두 번째 $obj2는 반복자 인터페이스를 구현하며 이 객체는 Traversable을 통해 판단할 수 있습니다. PHP 매뉴얼에서 Traversable 인터페이스는 foreach가 클래스를 탐색할 수 있는지 여부를 감지하는 데 사용되는 인터페이스입니다.

이 인터페이스에는 여러 가지 기능이 있습니다.

  1. 이 인터페이스를 구현하는 내장 클래스는 foreach를 사용하여 IteratorAggregate 또는 Iterator 인터페이스를 구현하지 않고도 순회할 수 있습니다.

  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제