/** * Creates the global constructor used in user-land * @return Func */ static function getGlobalConstructor() { $Boolean = new Func(function ($value = false) { $self = Func::getContext(); if ($self instanceof Bln) { $self->value = $value ? true : false; return $self; } else { return $value ? true : false; } }); $Boolean->instantiate = function () { return new Bln(); }; $Boolean->set('prototype', Bln::$protoObject); $Boolean->setMethods(Bln::$classMethods, true, false, true); return $Boolean; }
/** * Creates the global constructor used in user-land * @return Func */ static function getGlobalConstructor() { $String = new Func(function ($value = '') { $self = Func::getContext(); if ($self instanceof Str) { $self->value = to_string($value); return $self; } else { return to_string($value); } }); $String->instantiate = function () { return new Str(); }; $String->set('prototype', Str::$protoObject); $String->setMethods(Str::$classMethods, true, false, true); return $String; }
/** * Creates the global constructor used in user-land * @return Func */ static function getGlobalConstructor() { $Number = new Func(function ($value = 0) { $self = Func::getContext(); if ($self instanceof Number) { $self->value = to_number($value); return $self; } else { return to_number($value); } }); $Number->instantiate = function () { return new Number(); }; $Number->set('prototype', Number::$protoObject); $Number->setMethods(Number::$classMethods, true, false, true); //constants $Number->set('NaN', NAN); $Number->set('MAX_VALUE', INF); $Number->set('MIN_VALUE', -INF); $Number->set('NEGATIVE_INFINITY', -INF); $Number->set('POSITIVE_INFINITY', INF); return $Number; }
Date::$classMethods = array('now' => function () { return Date::now(); }, 'parse' => function ($str) { $date = new Date($str); return $date->value; }, 'UTC' => function () { $date = new Date(); $date->_initFromParts(func_get_args(), 'UTC'); return $date->value; }); Date::$protoMethods = array('valueOf' => function () { $self = Func::getContext(); return $self->value; }, 'toJSON' => function () { $self = Func::getContext(); //2014-08-09T12:00:00.000Z return $self->toJSON(); }, 'toUTCString' => function () { //todo }, 'toString' => function () { $self = Func::getContext(); //Sat Aug 09 2014 12:00:00 GMT+0000 (UTC) return str_replace('~', 'GMT', $self->date->format('D M d Y H:i:s ~O (T)')); }); Date::$protoObject = new Object(); Date::$protoObject->setMethods(Date::$protoMethods, true, false, true); //get the local timezone by looking for constant or environment variable; default to UTC Date::$LOCAL_TZ = defined('LOCAL_TZ') ? constant('LOCAL_TZ') : getenv('LOCAL_TZ'); if (Date::$LOCAL_TZ === false) { Date::$LOCAL_TZ = 'UTC'; }
$methods['defineProperty']($obj, $key, $prop->value); } } }); Object::$protoMethods = array('hasOwnProperty' => function ($key) { $self = Func::getContext(); $key = (string) $key; return array_key_exists($key, $self->data); }, 'toString' => function () { $self = Func::getContext(); if ($self === null) { $className = 'Undefined'; } else { if ($self === Object::$null) { $className = 'Null'; } else { $obj = objectify($self); $className = $obj->className; } } return '[object ' . $className . ']'; }, 'valueOf' => function () { return Func::getContext(); }); class Null { } Object::$null = new Null(); //the methods are not set on Object.prototype until *after* Func class is defined Object::$protoObject = new Object(); Object::$protoObject->proto = Object::$null;