PHP 교체 기와 생 성기 사용법 실례 분석

이 글 의 실례 는 PHP 교체 기와 생 성기 용법 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
교체 기
교체 기 는 실제 Iterator 를 실현 하 는 클래스 로 foreach 로 옮 겨 다 닐 수 있 습 니 다.
예 를 들 면:

<?php
class Sample implements Iterator{
  private $curIndex=0;
  private $items=null;
  public function __construct($_items) {
    $this->items = $_items;
  }
  public function current (){
    echo "current
"; return $this->items[$this->curIndex]; } public function key (){ echo "key
"; return $this->curIndex; } public function next (){ echo "next
"; $this->curIndex++; } public function rewind (){ $this->curIndex = 0; } public function send ( $value ){ if($value == "stop"){ $this->curIndex = null; } } public function valid (){ echo "valid
"; return isset($this->items[$this->curIndex]); } } $sample = new Sample([1,2,3]); foreach ($sample as $k =>$v){ }
출력
 valid current key next
foreach 는 먼저 valid 를 호출 하여 교체 기 가 효과 가 있 는 지 판단 한 다음 current 를 호출 하여 현재 값 을 가 져 오 는 동시에 next 이동 key 를 다음 값 으로 호출 합 니 다(출력 key 는$k=>$v 때 문 입 니 다).
생 성기
공식 문서 부터 볼 게 요.
생 성 기 는 간단 한 대상 의 교 체 를 실현 하기 위해 더욱 쉬 운 방법 을 제공 했다.비교 정의 류 가 Iterator 인 터 페 이 스 를 실현 하 는 방식 에 비해 성능 비용 과 복잡성 이 크게 떨어진다.
생 성 기 는 메모리 에 배열 을 만 들 지 않 고 foreach 코드 블록 에 코드 를 써 서 데 이 터 를 교체 할 수 있 도록 합 니 다.메모리 가 상한 선 에 이 르 거나 상당 한 처리 시간 을 차지 할 수 있 습 니 다.
반대로 생 성기 함 수 를 쓸 수 있 습 니 다.일반적인 사용자 정의 함수 처럼 일반 함수 와 한 번 만 되 돌려 주 는 것 과 달리 생 성 기 는 필요 에 따라 여러 번 yield 를 사용 하여 교체 가 필요 한 값 을 생 성 할 수 있 습 니 다.
PHP 는 값 이 필요 할 때마다 생 성기 함 수 를 호출 하고 값 이 생 긴 후에 생 성기 상 태 를 저장 합 니 다.그러면 다음 값 이 필요 할 때 호출 상 태 를 회복 할 수 있 습 니 다.
다음은 phop 공식 문서 의 예제 입 니 다.

<?php
function gen_one_to_three() {
  for ($i = 1; $i <= 3; $i++) {
    //    $i      yield        。
    yield $i;
  }
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
  echo "$value
"; } var_dump($generator); // Generator
위 와 같이 3 을 10000 으로 수정 하면$generator 에 대해 서 는 실제 적 으로 차이 가 없습니다.현재 값 만 저장 되 어 있 을 뿐(물론 내부 상태 도 있 습 니 다.여 기 는 간략화 하기 위해 서 입 니 다)10000 개의 수 를 만 들 지 않 았 습 니 다.
이 를 통 해 알 수 있 듯 이 생 성기 의 장점 은 메모리 의 사용 을 줄 이 고 필요 할 때 해당 하 는 값 을 생 성 하 는 것 이다.
php 문 서 를 보면 Generator 가 실제 적 으로 Iterator 의 구체 적 인 실현 임 을 알 수 있 습 니 다.yield 호출 시 되 돌아 오 는 Generator 대상 입 니 다.
그렇다면 교체 기와 생 성기 의 관 계 를 어떻게 이해 합 니까?
사실 생 성 기 는 교체 기의 실현+yield 로 생 성기 대상 이 생 겼 다.
우리 도 yield 와 유사 한 함 수 를 스스로 정의 할 수 있 습 니 다.다음 과 같 습 니 다.

function myYeild(){
  $args = func_get_args();
  return new Sample($args);
}
$generator = myYeild(1,2,3);
foreach ($generator as $value) {
  echo "$value
"; }
우리 의 my Yeild 는 phop 에 내 장 된 yeild 와 같이 사용 할 수 없습니다.yeild 는 호출 된 컨 텍스트 를 저장 하고 임시로 떠 나 며 return 이 없 기 때 문 입 니 다.
여 기 는 단지 유추 해 볼 뿐이다.
yeild 가 일반적인 대상 을 generator 로 포장 할 수 있 으 니 우리 iterator 는 yeild 를 통 해 Generator 처럼 할 수 있 습 니까?
답 은 좀 슬프다.yeild 는 들 어 오 는 값 을 매개 변수 로 Generator 인 스 턴 스 를 만 드 는 것 으로 우리 의 iterator 를 모른다.하지만 이렇게 디자인 하 는 것 도 합 리 적 이 고,
우리 만 의 iterator 가 믿 을 수 없 을 까 봐.
실제 사용 장소
  • 데이터 베 이 스 는
  • 에 널리 퍼 져 있다.
    커서 와 결합 하여 데이터 베 이 스 를 옮 겨 다 닐 때 한 번 에 모든 데 이 터 를 되 돌려 주지 않 고 한 줄 씩 가 져 올 수 있 습 니 다.
    
    class AllUser implements \Iterator
    {
      protected $index = 0;
      protected $data = [];
      public function __construct()
      {
        $link = mysqli_connect('192.168.0.91', 'root', '123', 'xxx');
        $rec = mysqli_query($link, 'select id from doc_admin');
        $this->data = mysqli_fetch_all($rec, MYSQLI_ASSOC);
      }
      //1      
      public function rewind()
      {
        $this->index = 0;
      }
      //2           
      public function valid()
      {
        return $this->index < count($this->data);
      }
      //3       
      public function current()
      {
        $id = $this->data[$this->index];
        return User::find($id);
      }
      //4   key    
      public function next()
      {
        return $this->index++;
      }
      //5      key
      public function key()
      {
        return $this->index;
      }
    }
    //         
    $users = new AllUser();
    //     
    foreach ($users as $user){
      $user->add_time = time();
      $user->save();
    }
    
    
  • 파일 옮 겨 다 니 기
    한 줄 읽 기
  • Iterator 인 터 페 이 스 를 실현 하여 일반 클래스 가 foreach 를 사용 하여 옮 겨 다 닐 수 있 도록 합 니 다.
  • 협 정,새 고 를 참조 하면 문장..
  • 메모:생 성기 의 함수 앞 에"&"를 추가 할 수 있 습 니 다.인용 을 사용 할 수 있 습 니 다.함수 에서 직접 return 하면 생 성 기 를 종료 합 니 다.
    더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기