ããæ°ã¶æPHPã°ããæ¸ãã¦ãã®ã§ããã$ary['foo']ããã$obj->fooã®æ¹ãæ¸ããããããªãã£ã¦ã®ã¨ãæªå®ç¾©ã®ãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ããæã«ã¨ã©ã¼ã«ãªããããªã®ã欲ããã£ã¦ã®ã§ãããªã®ãèãã¦ã¿ãã
æ¡1
<?php class Accessor Implements IteratorAggregate { private $ary; function __construct(&$ary) { $this->ary =& $ary; } function __get($name) { if (isset($this->ary[$name])) { return $this->ary[$name]; } throw new Exception(); } function __set($name, $val) { $this->ary[$name] = $val; } function getIterator() { return new ArrayIterator($this->ary); } } $ary= array( 'One' => 1, ); $obj = new Accessor($ary); $ary['two'] = 2; $obj->three = 3; foreach ($obj as $k => $v) { echo "$k = $v \n"; } var_dump($obj); å®è¡ ---------------- One = 1 two = 2 three = 3 object(Accessor)#1 (1) { ["ary:private"]=> &array(3) { ["One"]=> int(1) ["two"]=> int(2) ["three"]=> int(3) } }
ããã¯æ¢åã®arrayã«ãã¤ã³ãããæããå ã®arrayã®åç §ãæã£ã¦ãã®ã§ãå ãå¤æ´ãããã°ãªãã¸ã§ã¯ãå´ãå¤æ´ããã¾ããæ¬ ç¹ã¯å arrayãå¿ è¦ãªã®ã§ãnew Accessor(array(...));ã¿ãããªæ¸ãæ¹ã¯ã§ãã¾ããã
ãããããªãã£ã¦ã¤ã³ã¹ã¿ã³ã¹çææã«ã³ãã¼ãã¡ããã®ãªããã£ã¨åç´ã
æ¡2
<?php class Accessor { function __construct($ary) { foreach ($ary as $k => $v) { $this->$k = $v; } } function __get($name) { if (isset($this->$name)) { return $this->name; } throw new Exception(); } function __set($name, $val) { $this->$name = $val; } } $obj = new Accessor(array('One' => 1)); $obj->two = 2; foreach ($obj as $k => $v) { echo "$k = $v \n"; } var_dump($obj); å®è¡ ---------------- One = 1 two = 2 object(Accessor)#1 (2) { ["One"]=> int(1) ["two"]=> int(2) }
__set()ãå®ç¾©ããªããã°Immutableã«ã§ãããªãã¨ããã¹ãããæ§é ã®å ´åã©ããããã¨ããæ¬ ç¹ã¨ãã¦ãidentã«ä½¿ããªããã¼ãæ±ããã¨ãã§ããªãã£ã¦ã®ãããã¾ããã