Add __get() and __set() wrappers for KeyDescender. This allows $kd->{"some.descendable.key"} access.
Add __get() and __set() wrappers for KeyDescender. This allows $kd->{"some.descendable.key"} access.
diff --git a/base/key_descender.php b/base/key_descender.php
index 6875df1..5f722e8 100644
--- a/base/key_descender.php
+++ b/base/key_descender.php
@@ -136,6 +136,11 @@ class KeyDescender
}
}
+ // Wrappers for get() and set() so we can do magical property access, which
+ // will even apply to arrays.
+ public function __get($key) { return $this->get($key); }
+ public function __set($key, $value) { $this->set($key, $value); }
+
// Getters and setters.
// -------------------------------------------------------------------------
public function & root() { return $this->root; }
diff --git a/testing/tests/base/key_descender_test.php b/testing/tests/base/key_descender_test.php
index fe0cd08..c725141 100644
--- a/testing/tests/base/key_descender_test.php
+++ b/testing/tests/base/key_descender_test.php
@@ -163,4 +163,20 @@ class KeyDescenderTest extends \PHPUnit_Framework_TestCase
$desc->set('foo.test', 'abc');
$this->assertEquals('abc', $desc->get('foo.test'));
}
+
+ public function testMagicGetter()
+ {
+ $array = array('foo' => array('moo' => 'boo'));
+ $desc = new KeyDescender($array);
+ $this->assertEquals('boo', $desc->{"foo.moo"});
+ $this->assertSame($array['foo'], $desc->foo);
+ }
+
+ public function testMagicSetter()
+ {
+ $array = array('foo' => array('moo' => 'boo'));
+ $desc = new KeyDescender($array);
+ $desc->{"foo.moo"} = 'abc123';
+ $this->assertEquals('abc123', $desc->get('foo.moo'));
+ }
}