<?php 
 
 
/**
 
 * Class JSObject
 
 * @author  kevy <kevmt.com>
 
 * @license MIT License!
 
 */
 
 
/*!
 
 
usage:
 
 
$Cat = new JSObject([
 
    'name' => 'Tom',
 
    'alias' => 'the cat.',
 
    'who' => function () {
 
        return $this->name . ' alias ' . $this->alias;
 
    }
 
]);
 
 
echo $Cat->who(); // Tom alias the cat.
 
 
$Mouse = new JSObject(function () {
 
    $this->name = 'Jerry';
 
    $this->alias = 'the mouse.';
 
    $this->who = function () {
 
        return $this->name . ' alias ' . $this->alias;
 
    }
 
});
 
 
echo $Mouse->who(); // Jerry alias the mouse.
 
 
 
*/
 
class JSObject
 
{
 
    /**
 
     * JSObject constructor.
 
     * @param array|closure $opt
 
     */
 
    function __construct($opt = NULL)
 
    {
 
        $_call = null;
 
        
 
        if (is_array($opt) && !empty($opt)) {
 
            foreach ($opt as $name => $value) {
 
                $this->$name = $value;
 
            }
 
            if (isset($this->_init) &&
 
                (is_object($this->_init) && $this->_init instanceof Closure)
 
            ) {
 
                // bind to this object, so we can use `$this`
 
                $_call = $this->_init->bindTo($this);
 
            }
 
        } else {
 
            if (is_object($opt) && $opt instanceof Closure) {
 
                // bind to this object, so we can use `$this`
 
                $_call = $opt->bindTo($this);
 
            }
 
        }
 
 
        if (isset($_call)) {
 
            $rVal = $_call();
 
            if (!empty($rVal)) {
 
                return $rVal;
 
            }
 
        }
 
 
        return $this;
 
    }
 
 
    /**
 
     * @param $name
 
     * @param $args
 
     * @return mixed
 
     */
 
    function __call($name, $args)
 
    {
 
        if (is_callable($this->$name)) {
 
            if ($this->$name instanceof Closure) {
 
                // bind to this object, so we can use `$this`
 
                $_fn = $this->{$name}->bindTo($this);
 
            } else {
 
                $_fn = $this->{$name};
 
            }
 
            return call_user_func_array($_fn, $args);
 
        }
 
    }
 
}
 
 |