0. рдкрд░рд┐рдЪрдпред
рдорд╛рдирдХ php рдкреИрдХреЗрдЬ рдореЗрдВ 2 рджрд┐рд▓рдЪрд╕реНрдк рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдпреЗ Iterator рдФрд░ ArrayAccess рд╣реИрдВред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдлрд╝реЙрд░рдЪ,ред рджреВрд╕рд░рд╛, рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд $ рд╕рд░рдгреА [] = 'newItem' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рд░рдгреА рдХреЗ рдкреВрд░реНрдг рдЕрдиреБрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБ рдХреЛ рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
1. Iteratorред
Iterator (рдЙрд░реНрдл рдХрд░реНрд╕рд░) рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИред Php рдореЗрдВ, рдЗрд╕реЗ Iterator рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рд╡рд╛рдЗрдВрдб () - рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╢реВрдиреНрдп рд╕реНрдерд┐рддрд┐ рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд╡рд░реНрддрдорд╛рди () - рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреА рд╡рд╛рдкрд╕реА;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреБрдВрдЬреА () - рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреА рдХреБрдВрдЬреА рд▓реМрдЯрд╛рдПрдВ;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдЧрд▓рд╛ () - рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рд╢рд┐рдлреНрдЯ;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдиреНрдп () - Iterator рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :: рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдорд╛рдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rewind () рдпрд╛ Iterator :: next ()ред
рддрджрдиреБрд╕рд╛рд░, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд░реАрд╕реЗрдЯ (), рд╡рд░реНрддрдорд╛рди (), рдХреБрдВрдЬреА (), рдЕрдЧрд▓рд╛ () рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг 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. рдЧрдгрдирд╛ рдпреЛрдЧреНрдпред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдЧрд┐рдирддреА () рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рд╕рд╛рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ int count (рд╢реВрдиреНрдп) - рд╡рд╕реНрддреБ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
рдЙрджрд╛рд╣рд░рдг 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);
рдЕрдм рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреА рд╣реИ, рд╕реНрд╡рдпрдВ рдХреЛ рдирд╣реАрдВред
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);
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) {
7. рдЖрдЙрдЯрд░реЛред
рд▓реЗрдЦ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд┐рд▓реНрдб-рдЗрди рдХреНрд▓рд╛рд╕ ArrayObject (
http://www.php.net/manual/en/class.arrayobject.php ) рдореЗрдВ php рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред