Add list of blacklisted array functions, add more tests
This commit is contained in:
parent
c786004f22
commit
1dd57b18de
31
JSObject.php
31
JSObject.php
@ -30,6 +30,8 @@ class JSObject extends ArrayObject {
|
|||||||
|
|
||||||
foreach($params as $name => &$val)
|
foreach($params as $name => &$val)
|
||||||
{
|
{
|
||||||
|
if (empty($val)) continue;
|
||||||
|
|
||||||
// Bind '$this' for closures
|
// Bind '$this' for closures
|
||||||
if ($val instanceof Closure)
|
if ($val instanceof Closure)
|
||||||
{
|
{
|
||||||
@ -52,11 +54,34 @@ class JSObject extends ArrayObject {
|
|||||||
*/
|
*/
|
||||||
public function __call($name, $params = [])
|
public function __call($name, $params = [])
|
||||||
{
|
{
|
||||||
|
$function_blacklist = [
|
||||||
|
'array_change_key_case',
|
||||||
|
'array_combine',
|
||||||
|
'array_count_values',
|
||||||
|
'array_fill_keys',
|
||||||
|
'array_fill',
|
||||||
|
'array_key_exists',
|
||||||
|
'array_map',
|
||||||
|
'array_merge',
|
||||||
|
'array_merge_recursive',
|
||||||
|
'array_search',
|
||||||
|
'array_unshift',
|
||||||
|
];
|
||||||
|
|
||||||
// Allow array operations on the object
|
// Allow array operations on the object
|
||||||
if (substr($name, 0, 6) === 'array_' && is_callable($name))
|
if (substr($name, 0, 6) === 'array_' && is_callable($name) && ! in_array($name, $function_blacklist))
|
||||||
{
|
{
|
||||||
$args = array_merge($this->getArrayCopy(), $params);
|
$args = ( ! empty($params))
|
||||||
return call_user_func_array($name, [$args]);
|
? array_merge($this->getArrayCopy(), $params)
|
||||||
|
: $this->getArrayCopy();
|
||||||
|
|
||||||
|
// Make sure the array items in the array parameter aren't used as function parameters
|
||||||
|
if (count($args === 1))
|
||||||
|
{
|
||||||
|
$args = [$args];
|
||||||
|
}
|
||||||
|
|
||||||
|
return call_user_func_array($name, $args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call closures attached to the object
|
// Call closures attached to the object
|
||||||
|
20
README.md
20
README.md
@ -3,9 +3,25 @@ JSObject
|
|||||||
|
|
||||||
A PHP 5.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)
|
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:
|
The following array functions are blacklisted because of their parameter ordering, or unpredictable behavior:
|
||||||
|
|
||||||
|
* array_change_key_case
|
||||||
|
* array_count_values
|
||||||
|
* array_combine
|
||||||
|
* array_fill_keys
|
||||||
|
* array_fill
|
||||||
|
* array_key_exists
|
||||||
|
* array_map
|
||||||
|
* array_merge
|
||||||
|
* array_merge_recursive
|
||||||
|
* array_search
|
||||||
|
* array_unshift
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##Examples:
|
||||||
|
|
||||||
* Basic Usage
|
* Basic Usage
|
||||||
|
|
||||||
|
28
tests.php
28
tests.php
@ -15,6 +15,8 @@ require_once('simpletest/autorun.php');
|
|||||||
// Include JSObject
|
// Include JSObject
|
||||||
require_once('JSObject.php');
|
require_once('JSObject.php');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class JSObjectTests extends UnitTestCase {
|
class JSObjectTests extends UnitTestCase {
|
||||||
|
|
||||||
function TestIsA()
|
function TestIsA()
|
||||||
@ -41,6 +43,22 @@ class JSObjectTests extends UnitTestCase {
|
|||||||
$this->assertEqual($obj->x(), 50);
|
$this->assertEqual($obj->x(), 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List of blacklisted array functions
|
||||||
|
/*
|
||||||
|
'array_change_key_case',
|
||||||
|
'array_count_values',
|
||||||
|
'array_combine',
|
||||||
|
'array_fill_keys',
|
||||||
|
'array_fill',
|
||||||
|
'array_key_exists',
|
||||||
|
'array_map',
|
||||||
|
'array_merge',
|
||||||
|
'array_merge_recursive',
|
||||||
|
'array_search',
|
||||||
|
'array_unshift',
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
function TestArrayFlip()
|
function TestArrayFlip()
|
||||||
{
|
{
|
||||||
$obj = new JSObject([
|
$obj = new JSObject([
|
||||||
@ -61,4 +79,14 @@ class JSObjectTests extends UnitTestCase {
|
|||||||
$this->assertEqual($obj->array_keys(), ['x','y']);
|
$this->assertEqual($obj->array_keys(), ['x','y']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function TestArrayValues()
|
||||||
|
{
|
||||||
|
$obj = new JSObject([
|
||||||
|
'x' => 'foo',
|
||||||
|
'y' => 'bar'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEqual($obj->array_values(), ['foo','bar']);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user