Remove __invoke, add tests, fix closures
This commit is contained in:
parent
f604e0f04a
commit
c786004f22
37
JSObject.php
37
JSObject.php
@ -17,7 +17,7 @@
|
|||||||
*
|
*
|
||||||
* @package JSObject
|
* @package JSObject
|
||||||
*/
|
*/
|
||||||
class JSObject {
|
class JSObject extends ArrayObject {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the object
|
* Create the object
|
||||||
@ -26,19 +26,23 @@ class JSObject {
|
|||||||
*/
|
*/
|
||||||
public function __construct($params = [])
|
public function __construct($params = [])
|
||||||
{
|
{
|
||||||
|
parent::__construct($params, ArrayObject::ARRAY_AS_PROPS);
|
||||||
|
|
||||||
foreach($params as $name => &$val)
|
foreach($params as $name => &$val)
|
||||||
{
|
{
|
||||||
// Bind '$this' for closures
|
// Bind '$this' for closures
|
||||||
if ($val instanceof Closure)
|
if ($val instanceof Closure)
|
||||||
{
|
{
|
||||||
$val->bindTo($this);
|
$val = $val->bindTo($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the parameter to the object
|
// Add the parameter to the object
|
||||||
$this->$name = $val;
|
$this->$name = $val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magic method to invoke appended closures
|
* Magic method to invoke appended closures
|
||||||
*
|
*
|
||||||
@ -48,6 +52,14 @@ class JSObject {
|
|||||||
*/
|
*/
|
||||||
public function __call($name, $params = [])
|
public function __call($name, $params = [])
|
||||||
{
|
{
|
||||||
|
// Allow array operations on the object
|
||||||
|
if (substr($name, 0, 6) === 'array_' && is_callable($name))
|
||||||
|
{
|
||||||
|
$args = array_merge($this->getArrayCopy(), $params);
|
||||||
|
return call_user_func_array($name, [$args]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call closures attached to the object
|
||||||
if (is_callable($this->$name))
|
if (is_callable($this->$name))
|
||||||
{
|
{
|
||||||
return call_user_func_array($this->$name, $params);
|
return call_user_func_array($this->$name, $params);
|
||||||
@ -55,25 +67,6 @@ class JSObject {
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Treat invokation of the object as creating a new object
|
|
||||||
*
|
|
||||||
* @param mixed
|
|
||||||
* @return JSObject
|
|
||||||
*/
|
|
||||||
public function __invoke($params = [])
|
|
||||||
{
|
|
||||||
$class = __CLASS__;
|
|
||||||
|
|
||||||
// Create the new object
|
|
||||||
$obj = new $class();
|
|
||||||
|
|
||||||
// Pass the parameters to the constructor of the new object
|
|
||||||
$obj = call_user_func_array([$obj, '__construct'], $params);
|
|
||||||
|
|
||||||
return $obj;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// End of JSObject.php
|
// End of JSObject.php
|
31
README.md
31
README.md
@ -1,4 +1,33 @@
|
|||||||
JSObject
|
JSObject
|
||||||
========
|
========
|
||||||
|
|
||||||
A PHP5.4 class to emulate Javascript object literals.
|
A PHP 5.4 class to emulate Javascript object literals.
|
||||||
|
|
||||||
|
Also, can use ``array_`` functions to operate on the object's properties and values. (Only works for functions that start with ``array_`` and have the array as the first parameter)
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
* Basic Usage
|
||||||
|
|
||||||
|
$obj = new JSObject([
|
||||||
|
'a' => 10,
|
||||||
|
'b' => 5,
|
||||||
|
'c' => 0,
|
||||||
|
'x' => function() {
|
||||||
|
return $this->a * $this->b;
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
$obj->x(); // Returns 50
|
||||||
|
|
||||||
|
* Get an array of the properties of the object:
|
||||||
|
|
||||||
|
$obj = new JSObject([
|
||||||
|
'x' => 'foo',
|
||||||
|
'y' => 'bar'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$obj->array_keys() // Returns: array('x', 'y')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
64
tests.php
Normal file
64
tests.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* JSObject tests
|
||||||
|
*
|
||||||
|
* Requires simpletest - Either in PHP path,
|
||||||
|
* or in the folder with the test file
|
||||||
|
*/
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Include simpletest
|
||||||
|
// it has to be set in your php path, or put in the tests folder
|
||||||
|
require_once('simpletest/autorun.php');
|
||||||
|
|
||||||
|
// Include JSObject
|
||||||
|
require_once('JSObject.php');
|
||||||
|
|
||||||
|
class JSObjectTests extends UnitTestCase {
|
||||||
|
|
||||||
|
function TestIsA()
|
||||||
|
{
|
||||||
|
$obj = new JSObject([
|
||||||
|
'x' => [0,1,2]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertIsA($obj, 'ArrayObject');
|
||||||
|
$this->assertIsA($obj, 'JSObject');
|
||||||
|
}
|
||||||
|
|
||||||
|
function TestClosure()
|
||||||
|
{
|
||||||
|
$obj = new JSObject([
|
||||||
|
'a' => 10,
|
||||||
|
'b' => 5,
|
||||||
|
'c' => 0,
|
||||||
|
'x' => function() {
|
||||||
|
return $this->a * $this->b;
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEqual($obj->x(), 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
function TestArrayFlip()
|
||||||
|
{
|
||||||
|
$obj = new JSObject([
|
||||||
|
'x' => 'foo',
|
||||||
|
'y' => 'bar'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEqual($obj->array_flip(), ['foo' => 'x', 'bar' => 'y']);
|
||||||
|
}
|
||||||
|
|
||||||
|
function TestArrayKeys()
|
||||||
|
{
|
||||||
|
$obj = new JSObject([
|
||||||
|
'x' => 'foo',
|
||||||
|
'y' => 'bar'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEqual($obj->array_keys(), ['x','y']);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user