Php
/
Modern Php
- 1 Basics 5
-
Quotes S
-
Constants S
-
Control structures S
-
Reference S
-
Number systems S
- 2 Variables 4
-
Definition S
-
Variable variable S
-
Exists S
-
Type casting S
- 3 Operators 5
-
Aritmetic S
-
Bitwise S
-
String S
-
Comparison S
-
Logical S
- 4 Function 4
-
Definition S
-
Anonymous S
-
Reference S
-
Variable arguments S
- 5 Array 7
-
Basics S
-
Operations S
-
Create S
-
Search S
-
Modify S
-
Sort S
-
Storage S
- 6 String 9
-
Basics
-
Compare
-
Search
-
Replace
-
Format
-
Regexp
-
Parse
-
Formating
-
Json
- 7 Streams 6
-
File open
-
Read file
-
Read csv
-
File contents
-
Context
-
Ob_start
- 8 Oop 6
-
Object instantiation S
-
Class constructor
-
Interfaces, abstract
-
Resource visibility
-
Class constants
-
Namespaces
- 9 Features 9
-
Autoload
-
Class reflection
-
Magic methods
-
Exceptions S
-
Late static binding
-
Type hinting
-
SPL
-
PHPUNIT
-
PHAR
- 10 Versions 2
-
Php7.4 S
-
Php8.0 S
- 11 Http 4
-
Headers
-
File Uploads
-
Cookies
-
Sessions
- 12 Design Patterns 4
-
Singleton Pattern S
-
Observer Pattern
-
Strategy Pattern
-
Registry
- 13 Modern Php 8
-
Composer S
-
Slim Framework
-
Autoloader
-
Package
-
Releases
-
Generators
-
Dependency Injection
-
Middleware
- 14 Create Framework 7
-
App
-
Http Foundation
-
Front Controller
-
Routing
-
Render Controller
-
Resolver
-
SoC
- 15 Frameworks 4
-
Symfony v5
-
Laravel v8
-
Laminas v3
-
Codeigniter v4
- 16 Composer 5
-
Guzzle
-
Carbon
-
Faker
-
Math
-
Requests
- 17 Symfony 6
-
Routes S
-
Annotations
-
Flex
-
Controllers
-
Doctrine
-
Templating
R
Q
Yield values
A generator function looks like a normal function, except of returning a value. It yields as many values as it needs to.
function myGenerator()
{
for ($i=1; $i<=3; $i++) {
yield $i;
}
}
Generator class is implementing Iterator interface.
You have to loop over to get values.
code
function myGenerator()
{
for ($i=1; $i<=3; $i++) {
yield $i;
}
}
foreach (myGenerator() as $v) {
echo $v . PHP_EOL;
}
// Outputs: 1 2 3
Yield doesn't stop the execution of the function and returning,
Yield provides a value and pause the execution of the function.
Examples
This is an example without generator (bad).
code
// bad example
function makeRange($length)
{
$data = array();
$i = 0;
while( $i++ < $length) <span class='keyword_code'>$data[]</span> = $i;
echo round(memory_get_usage() / 1024 / 1024, 2) . ' MB'. "<br>";
return $data;
}
foreach(makeRange(1000000) as $v) {} // 32.38 MB
foreach(makeRange(3000000) as $v) {} // Allowed memory exhausted
This is how generators save memory (good).
code
// yield example
function makeRange($length)
{
$i = 0;
while( $i++ < $length) yield $i;
echo round(memory_get_usage() / 1024 / 1024, 2) . ' MB'. "<br>";
}
foreach(makeRange(1000000) as $v) {} // 0.37 MB
foreach(makeRange(3000000) as $v) {} // 0.37 MB
Big files example,
function makeFile() {
if ($fd = fopen("generators.txt", "w+")) {
$i = 0;
while($i++ < 10000000) { // <span class='keyword_code'>128 MB</span> allowed in php
fwrite($fd, $i . " GGG <br>");
}
fclose($fd);
}
}
//makeFile(); // <span class='keyword_code'>152 MB</span> generators.txt
function getRows() {
if ($fd = fopen("generators.txt", "rb")) {
while (!feof($fd)) {
<span class='keyword_code'>yield</span> fgets($fd, 4096);
}
}
}
function getRowsArray() {
$data = array();
if ($fd = fopen("generators.txt", "rb")) {
while (!feof($fd)) {
<span class='keyword_code'>$data[]</span> = fgets($fd, 4096);
}
}
return $data;
}
// yield
foreach(getRows() as $v) {} echo "<span class='keyword_code'>it works with yield</span>";
// array
foreach(getRowsArray() as $v) {}
// Allowed memory size of 134217728 bytes <span class='keyword_code'>exhausted</span>
➥ Questions