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();
}
한 줄 읽 기
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.