Skip to content

Instantly share code, notes, and snippets.

@timw4mail
Created November 30, 2011 20:22
Show Gist options
  • Save timw4mail/1410650 to your computer and use it in GitHub Desktop.
Save timw4mail/1410650 to your computer and use it in GitHub Desktop.
PHP Class for javascript-like objects
<?php
ob_start("ob_gzhandler");
require('JSObject.php');
$foo = new JSObject(array(
'bar' => array(
1,
2,
3
),
'baz' => function($self)
{
return $self->__toString('var_export');
}
));
$bar = new JSObject(array(
'bar' => array(
1,
2,
3
),
'baz' => function($self)
{
return $self->__toString('var_dump');
}
));
echo $foo->baz();
echo $bar->baz();
$foo->foo = $bar;
echo $foo;
echo (int)isset($foo->baz2);
echo $foo(array(1,2,3));
echo $bar(array("a","b","c"));
<?php
/**
* JSObject
*
* Class for creating object-literal-like contstructs in PHP
*/
class JSObject {
/**
* Constructor for creating the objects
*/
function __construct($members = array())
{
// Add the passed parameters to the object
foreach($members as $name => $value)
{
$this->$name = $value;
}
}
// --------------------------------------------------------------------------
/**
* PHP magic method to facilitate dynamic methods
*
* @param string $name
* @param array $args
*/
function __call($name, $args)
{
if(is_callable($this->$name))
{
//Add $this to the beginning of the args array
array_unshift($args, $this);
//Call the dynamic function
return call_user_func_array($this->$name, $args);
}
}
// --------------------------------------------------------------------------
/**
* Prints out the contents of the object when used as a string
*
* @return string
*/
function __toString()
{
$args = func_get_args();
$method = ( ! empty($args)) ? $args[0] : "print_r";
$output = '<pre>';
if($method == "var_dump")
{
ob_start();
var_dump($this);
$output .= ob_get_contents();
ob_end_clean();
}
else if($method == "var_export")
{
ob_start();
var_export($this);
$output .= ob_get_contents();
ob_end_clean();
}
else
{
$output .= print_r($this, TRUE);
}
return $output . '</pre>';
}
// --------------------------------------------------------------------------
/**
* Constructor without the "new"
*
* @param array $members
*/
function __invoke($members=array())
{
return new JSObject($members);
}
}
// End of JSObject.php
@timw4mail
Copy link
Author

@cowboy Doesn't recursively applying the class to arrays remove any arrays from the object, though? I got the code from somewhere else, I'm still toying around in my head as to what I would use it for.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment