Iterator, ArrayAccess, Countable: Object as an array

0. рдкрд░рд┐рдЪрдпред


рдорд╛рдирдХ php рдкреИрдХреЗрдЬ рдореЗрдВ 2 рджрд┐рд▓рдЪрд╕реНрдк рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдпреЗ Iterator рдФрд░ ArrayAccess рд╣реИрдВред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдлрд╝реЙрд░рдЪ,ред рджреВрд╕рд░рд╛, рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд $ рд╕рд░рдгреА [] = 'newItem' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рд░рдгреА рдХреЗ рдкреВрд░реНрдг рдЕрдиреБрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБ рдХреЛ рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

1. Iteratorред


Iterator (рдЙрд░реНрдл рдХрд░реНрд╕рд░) рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИред Php рдореЗрдВ, рдЗрд╕реЗ Iterator рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рддрджрдиреБрд╕рд╛рд░, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд░реАрд╕реЗрдЯ (), рд╡рд░реНрддрдорд╛рди (), рдХреБрдВрдЬреА (), рдЕрдЧрд▓рд╛ () рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг 1:
class Iteratable implements Iterator { protected $_position = 0; protected $_container = array ( 'item1', 'item2', 'item3' ); public function __construct() { $this->_position = 0; } public function rewind() { $this->_position = 0; } public function current() { return $this->_container[$this->_position]; } public function key() { return $this->_position; } public function next() { ++$this->_position; } public function valid() { return isset($this->_container[$this->_position]); } } $iteratable = new Iteratable; foreach ($iteratable as $item) { var_dump($iteratable->key(), $item); } 


рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЧ рдЕрднреА рднреА рдЫрджреНрдо-рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИред рдЕрдм рдпрд╣ рдЕрднреА рднреА рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

2. ArrayAccessред


рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЙрдкрд▓рдмреНрдз рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ 4 рд╕рд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:


рдЙрджрд╛рд╣рд░рдг 2:
 class ArrayAccessable implements ArrayAccess { protected $_container = array(); public function __construct($array = null) { if (!is_null($array)) { $this->_container = $array; } } public function offsetExists($offset) { return isset($this->_container[$offset]); } public function offsetGet($offset) { return $this->offsetExists($offset) ? $this->_container[$offset] : null; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->_container[] = $value; } else { $this->_container[$offset] = $value; } } public function offsetUnset($offset) { unset($this->_container[$offset]); } } $array = new ArrayAccessable(array('a', 'b', 'c', 'd', 'e' => 'assoc')); var_dump($array); unset($array['e']); var_dump('unset: ', $array); $array['meta'] = 'additional element'; var_dump('set: ', $array); var_dump(count($array)); 


рдЕрдм ArrayAccessable class рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрд░реИ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЧрд┐рдирддреА () рдЕрднреА рднреА 1 рд▓реМрдЯрддреА рд╣реИ (рдРрд╕рд╛ рдХреНрдпреЛрдВ? рджреЗрдЦреЗрдВ http://www.php.net/manual/en/function.count.php )ред

3. рдЧрдгрдирд╛ рдпреЛрдЧреНрдпред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдЧрд┐рдирддреА () рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдЙрджрд╛рд╣рд░рдг 3
 class CountableObject implements Countable { protected $_container = array('a', 'b', 'c', 'd'); public function count() { return count($this->_container); } } $countable = new CountableObject; var_dump(count($countable)); 

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдЕрднреА рднреА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реЛ рд░рд╣реА рд╣реИ, рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ ...

4. рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдпред


рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
2 рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


рдЙрджрд╛рд╣рд░рдг 4
 class SerializableObject implements Serializable { protected $_container = array('a', 'b', 'c', 'd'); public function serialize() { return serialize($this->_container); } public function unserialize($data) { $this->_container = unserialize($data); } } $serializable = new SerializableObject; var_dump($serializable); // SerializableObject file_put_contents('serialized.txt', serialize($serializable)); $unserialized = unserialize(file_get_contents('serialized.txt')); var_dump($unserialized); // SerializableObject 


рдЕрдм рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреА рд╣реИ, рд╕реНрд╡рдпрдВ рдХреЛ рдирд╣реАрдВред

5. рдкрд░рд┐рдгрд╛рдоред


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░, рд╣рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдПрдХ рд╕рд░рдгреА рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред
рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ array_pop () рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк php 5.3 __invoke () рд╕реЗ рдирдИ рдореИрдЬрд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
 public function __invoke(array $data = null) { if (is_null($data)) { return $this->_container; } else { $this->_container = $data; } } $array = new SemiArray(array('a', 'b', 'c', 'd', 'e' => 'assoc')); $tmp = $array(); array_pop($tmp); $array($tmp); var_dump('array_pop', $array); 


рд╡рд┐рдХрд▓реНрдк рдмреИрдХрдЕрдк рд╣реИ, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдЧ рдХреА рдкреВрд░реА рд╕реВрдЪреА:
 class SemiArray implements ArrayAccess, Countable, Iterator, Serializable { protected $_container = array(); protected $_position = 0; public function __construct(array $array = null) { if (!is_null($array)) { $this->_container = $array; } } public function offsetExists($offset) { return isset($this->_container[$offset]); } public function offsetGet($offset) { return $this->offsetExists($offset) ? $this->_container[$offset] : null; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->_container[] = $value; } else { $this->_container[$offset] = $value; } } public function offsetUnset($offset) { unset($this->_container[$offset]); } public function rewind() { $this->_position = 0; } public function current() { return $this->_container[$this->_position]; } public function key() { return $this->_position; } public function next() { ++$this->_position; } public function valid() { return isset($this->_container[$this->_position]); } public function count() { return count($this->_container); } public function serialize() { return serialize($this->_container); } public function unserialize($data) { $this->_container = unserialize($data); } public function __invoke(array $data = null) { if (is_null($data)) { return $this->_container; } else { $this->_container = $data; } } } 

рдкрд░реАрдХреНрд╖рдг:
 $array = new SemiArray(array('a', 'b', 'c', 'd', 'e' => 'assoc')); var_dump($array); $array->next(); var_dump('advanced key: ', $array->key()); unset($array['e']); var_dump('unset: ', $array); $array['meta'] = 'additional element'; var_dump('set: ', $array); echo 'count: '; var_dump(count($array)); file_put_contents('serialized.txt', serialize($array)); echo 'unserialized:'; var_dump($array); // SemiArray $array = unserialize(file_get_contents('serialized.txt')); $tmp = $array(); array_pop($tmp); $array($tmp); var_dump('array_pop', $array); 

6. рд╕реНрдХреЛрдкред


6.1ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВред

рдЪреЗрддрд╛рд╡рдиреА! рдЫрджреНрдо рдХреЛрдбред
 class Rowset extends SemiArray { protected $_total; public function __construct() { $this->_total = $db->query('SELECT FOUND_ROWS() as total')->total; } public function getTotal() { return $this->_total; } } $rowset = new Rowset(); while ($obj = mysql_fetch_object($res)) { $rowset[] = $obj; } foreach ($rowset as $row) { // ... } $rowset->getTotal(); // total row count 


7. рдЖрдЙрдЯрд░реЛред


рд▓реЗрдЦ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд┐рд▓реНрдб-рдЗрди рдХреНрд▓рд╛рд╕ ArrayObject ( http://www.php.net/manual/en/class.arrayobject.php ) рдореЗрдВ php рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

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


All Articles