이 글에서는 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가 클래스를 탐색할 수 있는지 여부를 감지하는 데 사용되는 인터페이스입니다.
이 인터페이스에는 여러 가지 기능이 있습니다.
이 인터페이스를 구현하는 내장 클래스는 foreach를 사용하여 IteratorAggregate 또는 Iterator 인터페이스를 구현하지 않고도 순회할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!