рдпрджрд┐ PHP рдХреЗ рдкрд╛рд╕ рд╕реВрдЪреА рдЖрд╡рдВрдЯрди рдФрд░ рдЬрдирд░реЗрдЯрд░ рдереЗ

рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ, PHP рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░, рдХрд┐рд╕реА рдХреЗ рд╣реИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реБрдЭрд╛рд╡ рдерд╛ рдЬрд┐рд╕рдиреЗ рдЬрдирд░реЗрдЯрд░, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╕реВрдЪреА рдЖрд╡рдВрдЯрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛ ред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ PHP рдХреЗ рдХреЛрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВред рдореИрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдФрд░ рдЗрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

XML рдШреЛрд╖рдгрд╛рддреНрдордХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ


рд╕рдмрд╕реЗ рддреЗрдЬ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ рдмрдбрд╝реА XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред

<?php function *readXML($file) { $r = new XMLReader; $r->open($file); while($r->read()) { yield $r; } } function *filterNodes(callable $predicate, $nodes) { foreach($nodes as $node) if($predicate($node)) yield $node; } function matchName($name) { return function($node) use($name) { return $node->name === $name; }; } 

рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдгред

 <?php function *getArticlesFromXML($file) { foreach(filterNodes(matchName('article'), readXML($file)) as $node) yield nodeToArticle($node); } function nodeToArticle($node) { // transform node return $node->name; } $articles = [foreach(getArticlesFromXML('data.xml') as $article) yield $article]; 

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА XMLReader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд╡реЗ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ while рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рдг рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ "рд╕рдорд╛рдпреЛрдЬрд┐рдд" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рд░рд▓ рд╕рдЬрд╛рд╡рдЯ


рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореБрдЭреЗ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрдирдХреЗ рдЙрддреНрддрд░ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рдирд╣реАрдВ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред

 <?php // inside some class public function getResult() { return SomeCustomIterator($this->results, new SomeCustomDecorator); } // with generators public function *getResults() { foreach($this->results as $result) yield new SomeCustomDecorator($result); } 


рдЕрдзрд┐рдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕рд┐рд╡ рдПрдкреАрдЖрдИ рдлрд┐рд░


рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд, рдЕрдзрд┐рдХрд╛рдВрд╢ PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдХрдо-рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА, рдФрд░ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрд╡рд╕рд░ PHP рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд▓реЛрдЧ рдЗрд╕рдореЗрдВ рдХреИрд╕реЗ рджреЗрд░реА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

рдорд┐рд╢реНрд░рд┐рдд рд╢реИрд▓рд┐рдпреЛрдВ (рдУрдУрдкреА рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╡реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 <?php function select() { return func_get_args(); } function from($source) { return $source; } function where() { return func_get_args(); } function *query($select, $from, $where) { foreach($from as $element) { foreach($where as $predicate) { if(false === $predicate($element)) continue 2; } $fields = array(); foreach($select as $selector) { $fields[] = $selector($element); } yield $fields; } } $articles = query( select(property('name')), from(readXML('data.xml')), where(matchName('article')) ); // where property could be something as simple as function property($name) { return function($node) use ($name) { return $node->{$name}; }; } 

рдпрд╛ рд╢рд╛рдпрдж LINQ рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд┐рд░реНрдорд╛рдг? рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред

рдпрд╣ рдЕрдЬрдЧрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


рдРрд╕реА рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдереАрдВ рдЬрд┐рдирдореЗрдВ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдкрд╣рд▓реВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЗред рдореБрдЭреЗ рддрдм рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдФрд░ рдЕрдм рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЕрдЪреНрдЫреА рдЦрдмрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ: рдХреЛрдИ рднреА рднрд╛рд╖рд╛ рдкрд░рд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ (рдмреЗрд╢рдХ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП)ред

рдЦреБрдж рдХреЛ рдкрд░рдЦреЛ


рдпрджрд┐ рдЖрдк рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рд░реБрдЪрд┐ рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЯреИрдм рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред

 $ git clone -b addListComprehensions https://github.com/nikic/php-src.git $ cd php-src $ ./buildconf $ ./configure $ make cli $ ./sapi/cli/php some-example-file.php 

Source: https://habr.com/ru/post/In147885/


All Articles