Skip to content

Commit 64c19e1

Browse files
committed
Allow ArrayAccess in dot helper
1 parent 093f7ce commit 64c19e1

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

src/JsPhpize/Compiler/Helpers/Dot.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
function ($base) {
2-
$getCallable = function ($base, $key) {
2+
$getFromArray = function ($base, $key) {
3+
return isset($base[$key])
4+
? $base[$key]
5+
: null;
6+
};
7+
$getCallable = function ($base, $key) use ($getFromArray) {
38
if (is_callable(array($base, $key))) {
49
return array($base, $key);
510
}
11+
if ($base instanceof \ArrayAccess) {
12+
return $getFromArray($base, $key);
13+
}
614
};
715
foreach (array_slice(func_get_args(), 1) as $key) {
816
$base = is_array($base)
9-
? (isset($base[$key])
10-
? $base[$key]
11-
: null
12-
)
17+
? $getFromArray($base, $key)
1318
: (is_object($base)
1419
? (isset($base->$key)
1520
? $base->$key

tests/dotHelper.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,33 @@ public function __isset($name)
2424
}
2525
}
2626

27+
class ArrayAccessObject implements \ArrayAccess
28+
{
29+
protected $data = array(
30+
'foo' => 'bar',
31+
);
32+
33+
public function offsetGet($name)
34+
{
35+
return $this->data[$name];
36+
}
37+
38+
public function offsetExists($name)
39+
{
40+
return isset($this->data[$name]);
41+
}
42+
43+
public function offsetSet($name, $value)
44+
{
45+
$this->data[$name] = $value;
46+
}
47+
48+
public function offsetUnset($name)
49+
{
50+
unset($this->data[$name]);
51+
}
52+
}
53+
2754
class DotHelperTest extends \PHPUnit_Framework_TestCase
2855
{
2956
protected function getDotHelper()
@@ -114,4 +141,13 @@ public function testMagicMethod()
114141
$this->assertSame('biz', call_user_func($dotHelper($object, 'bar')));
115142
$this->assertSame(null, call_user_func($dotHelper($object, 'biz')));
116143
}
144+
145+
public function testArrayAccess()
146+
{
147+
$dotHelper = $this->getDotHelper();
148+
$object = new ArrayAccessObject();
149+
150+
$this->assertSame('bar', $dotHelper($object, 'foo'));
151+
$this->assertSame(null, $dotHelper($object, 'biz'));
152+
}
117153
}

0 commit comments

Comments
 (0)