ジェネレータにつきまして、お聞きしたいことがあります。
php
1<?php 2function gen_one_to_three() { 3 for ($i = 1; $i <= 3; $i++) { 4 // yield を繰り返す間、$i の値が維持されることに注目しましょう 5 yield $i; 6 } 7} 8 9$generator = gen_one_to_three(); 10foreach ($generator as $value) { 11 echo "$value\n"; 12} 13?>
上記の「$generator = gen_one_to_three();」ここの部分についてなのですが、「$generator」は「gen_one_to_three();」が処理された結果が入っていると思うのですが、returnでしたら、返り値が返ると思うのですが、returnはしていない為、何が代入されているかが分からないです...
var_dumpしてみましたら「object(Generator)#1 (0) { }」このように表示されたのですが、これも良く分かりません...
上記の点につきまして、混乱してしまっている部分もあるため、どなたかご教示頂けましたら幸いです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
マニュアルから抜粋したのなら、マニュアルを読めばよいです。
yield
がキモです。
余談
php においてジェネレータ関数を使用するのは非常に限定的です。
・巨大なファイルの読み込み
・外部サービスの使用
等
今必要でないのであれば、混乱するし理解に時間がかかるので後回しにしたほうが良いです。
困ったときには自然と必要になりますが、(php を使用する上では)困るまで忘れて良いです仕組みです。
追記
コレで分かれば飛ばさなくてもイイよw
php
1<?php 2function gen_one_to_three() { 3 echo '1回目の呼び出し'.PHP_EOL; 4 yield 1; 5 echo '2回目の呼び出し'.PHP_EOL; 6 yield 2; 7 echo '3回目の呼び出し'.PHP_EOL; 8 yield 3; 9} 10 11$generator = gen_one_to_three(); 12foreach ($generator as $value) { 13 echo 'gen_one_to_three()を呼び出し'.PHP_EOL; 14 echo "$value".PHP_EOL; 15}
投稿2019/03/19 01:48
編集2019/03/19 02:01退会済みユーザー
総合スコア0
0
ベストアンサー
PHPのジェネレータ構文の内部実装が実際のところどうなのかは分かりませんが、generatorの概念は次のようなクラスが背後にあると考えるのが理解しやすいと思います。
php
1<?php 2class gen_one_to_three implements Iterator { 3 private $start; 4 private $limit; 5 private $cur; 6 7 public function __construct() { 8 $this->start = 1; 9 $this->limit = 3; 10 $this->cur = 1; 11 } 12 function rewind() 13 { 14 $this->cur = $this->start; 15 } 16 17 function current() 18 { 19 return $this->cur; 20 } 21 22 function key() 23 { 24 return ($this->cur) - 1; 25 } 26 27 function next() 28 { 29 if($this->cur > $this->limit) { return FALSE; } 30 return $this->cur++; 31 } 32 33 function valid() 34 { 35 return $this->key() >= 0 && $this->key() < $this->limit; 36 } 37} 38$generator = new gen_one_to_three(); 39foreach ($generator as $value) { 40 echo "$value\n"; 41}
投稿2019/03/19 01:20
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/19 01:52
2019/03/19 02:36
2019/03/19 02:48
2019/03/19 03:26
2019/03/19 03:41
2019/03/19 03:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/19 01:55
退会済みユーザー
2019/03/19 02:02
2019/03/19 03:56