2016-06-15 3 views
7

어제 저는 PHP가 yield() 방법을 가지고 있음을 알았습니다. 필자는 PHP에서의 유용성에 대해 확신하지 못했습니다.PHP 산출량 대 PDO 가져 오기?

동료는 잠재적 인 메모리 문제를 일으키는 SQL 문이 여러 행을 반환하는 데 도움이 될 수 있다고 말했다. 나는 그가 fetchAll()을 추천하고 있었다고 생각한다. 그러나 fetchAll()을 사용하는 대신 fetch()을 사용하고 행을 하나씩 처리 할 수도 있습니다. 따라서 yield()은 그가 언급 한 문제를 해결하는 데 중요하지 않습니다.

여기에 yield()fetch()이 누락 되었나요? yield()과 발전기를 사용할 때 더 많은 이점이 있습니까?

P.S : 그것이 fetch()와보다 yield() 큰 애플리케이션에서, 깨끗한 읽고 maitainable 코드를 작성하는 것이 더 쉽습니다 것은 사실이다.

+3

, PDO는 수율 usefilness를위한 아주 좋은 예가 아니다 PDO 때문에 문은 이미 traversable 인터페이스를 구현하고 foreach를 사용하여 반복 할 수 있습니다. 그러나 mysqli를 사용하면 yield를 사용하여 mysqli 결과를 foreach로 반복 할 수있다. –

+1

일반적으로 이것은 발전기 *가 유용하게 사용되는 것으로 나타납니다 (왜냐하면 '수율'은 발전기의 구현 세부 사항이기 때문입니다). 생성자는 배열 (또는 iterable *)처럼 동작하지만 메모리에 모든 데이터를 저장하지 않지만 필요에 따라 각 반복마다 * 생성합니다. 예, 이것은 데이터베이스 결과를 가져 오는 맥락에서 사용될 수 있지만, 무한 카운터 또는 여러 가지 다른 것들을 구현하는 데에도 사용될 수 있습니다. – deceze

답변

9

따라서 yield()는 그가 언급 한 문제를 해결하는 데 중요하지 않습니다.

정확히.

그러나 메모리 오버 헤드없이 원하는 경우/fetch() 시퀀스를 foreach() 호출로 위장 할 수 있습니다. PDOStatement 이미 이렇게 can be iterated over using foreach()에 이동 인터페이스를 구현하고 있기 때문에

그러나 PDO는 매우 좋은 예되지 않습니다 :

$stmt = $pdo->query('SELECT name FROM users'); 
foreach ($stmt as $row) 
{ 
    var_export($row); 
} 

그래서의 수는 스트림이 하나 하나 결과 예제 API에 대한 mysqli를 보자.
을 수정하십시오. 실제로는 since 5.4.0 mysqli supports Traversable도 마찬가지이므로 mysqli_result와 함께 yield를 사용할 필요가 없습니다. 하지만, 데모 용으로 보관 해 둡시다.

의이

function mysqli_gen (mysqli_result $res) 
{ 
    while($row = mysqli_fetch_assoc($res)) 
    { 
     yield $row; 
    } 
} 

같은 발전기를 만들어 보자 그리고 지금 당신이 오버 헤드없이 foreach 문을 사용하여 행을 얻을 수 있습니다 : 음

$res = $mysqli->query("SELECT * FROM users"); 
foreach (mysqli_gen($res) as $row) 
{ 
    var_export($row); 
} 
관련 문제