Difference between revisions of "Objective-PHP"
From Electriki
Jump to navigationJump to search (Created page with "<code> <?="shit" ?> </code>") |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | < | + | This is something i wrote some time in 2k9 just for the hell of it |
− | <?=" | + | <pre> |
− | </ | + | <?php |
+ | |||
+ | /** | ||
+ | * @package OPHPLolwut | ||
+ | */ | ||
+ | |||
+ | Abstract class superObject { | ||
+ | private $binded= array(); | ||
+ | |||
+ | function __call($name,$args) { | ||
+ | if(!isset($this->$name)) { | ||
+ | if(!isset($this->binded[$name]) || $this->binded[$name] !== true) throw new noMethodError(); | ||
+ | $this->$name= new $name(); | ||
+ | } | ||
+ | return $this->$name->doIt($this,$args); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * @param mixed $i input | ||
+ | * @param array $args arguments | ||
+ | */ | ||
+ | abstract function doIt($i,$args); | ||
+ | |||
+ | /** | ||
+ | * @var string $name | ||
+ | */ | ||
+ | function bind($name) { | ||
+ | $this->binded[$name]= true; | ||
+ | } | ||
+ | |||
+ | function unbind($name=null) { | ||
+ | if(isset($this->binded[$name])) { | ||
+ | $this->binded["name"]= false; | ||
+ | unset($this->$name); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function __construct() { | ||
+ | $this->bind('hasMethod'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class object extends superObject { | ||
+ | function __construct() { | ||
+ | parent::__construct(); | ||
+ | } | ||
+ | function doIt($i,$args) { | ||
+ | return $this; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class superException extends Exception { | ||
+ | function __construct($message="",$data=null,$code=0) { | ||
+ | parent::__construct($message,$code); | ||
+ | $this->data= $data; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class error extends superException {} | ||
+ | class noMethodError extends error {} | ||
+ | |||
+ | class hasMethod extends object { | ||
+ | function doIt($i,$args) { | ||
+ | $method= array_pop($args); | ||
+ | return method_exists($i,$method); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | class value extends object { | ||
+ | function __construct() { | ||
+ | $this->bind('set'); | ||
+ | $this->bind('get'); | ||
+ | $this->bind('isset_'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class set extends object { | ||
+ | function doIt($i,$args) { | ||
+ | if(count($args) != 1) throw new superException("",$args); | ||
+ | |||
+ | if($i instanceOf value) { $i->value= array_pop($args); return $i; } | ||
+ | #if($i instanceOf accessor) { $i->value()->set(array_pop($args)); return $i; } | ||
+ | return new nil(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class get extends object { | ||
+ | function doIt($i,$args) { | ||
+ | if($i instanceOf value) { if($i->isset_()) return $i->value; } | ||
+ | if($i instanceOf accessor) { return $i->value()->get(); } | ||
+ | return new nil(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class isset_ { | ||
+ | function doIt($i,$args) { | ||
+ | if($i instanceof value) { if(isset($i->value)) return $i->value; } | ||
+ | return new nil(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | class accessor extends object { | ||
+ | function __construct() { | ||
+ | $this->bind('value'); | ||
+ | } | ||
+ | function doIt($i,$args) { | ||
+ | if(isset($args[0])) { | ||
+ | return $this->value()->set($args[0]); | ||
+ | } | ||
+ | return $this->value()->get(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ############################################################################# | ||
+ | |||
+ | |||
+ | try { | ||
+ | |||
+ | $a= new accessor(); | ||
+ | $a->value()->set("abc123"); | ||
+ | echo $a->value()->get(); | ||
+ | |||
+ | }catch(SuperException $e) { | ||
+ | printf($e->getTraceAsString()." ".$e->getFile()."(".$e->getLine().")\nMessage:".$e->getMessage()."\nData:\n".var_export($e->data,1)); | ||
+ | } | ||
+ | </pre> |
Latest revision as of 22:26, 14 July 2011
This is something i wrote some time in 2k9 just for the hell of it
<?php /** * @package OPHPLolwut */ Abstract class superObject { private $binded= array(); function __call($name,$args) { if(!isset($this->$name)) { if(!isset($this->binded[$name]) || $this->binded[$name] !== true) throw new noMethodError(); $this->$name= new $name(); } return $this->$name->doIt($this,$args); } /** * @param mixed $i input * @param array $args arguments */ abstract function doIt($i,$args); /** * @var string $name */ function bind($name) { $this->binded[$name]= true; } function unbind($name=null) { if(isset($this->binded[$name])) { $this->binded["name"]= false; unset($this->$name); } } function __construct() { $this->bind('hasMethod'); } } class object extends superObject { function __construct() { parent::__construct(); } function doIt($i,$args) { return $this; } } class superException extends Exception { function __construct($message="",$data=null,$code=0) { parent::__construct($message,$code); $this->data= $data; } } class error extends superException {} class noMethodError extends error {} class hasMethod extends object { function doIt($i,$args) { $method= array_pop($args); return method_exists($i,$method); } } class value extends object { function __construct() { $this->bind('set'); $this->bind('get'); $this->bind('isset_'); } } class set extends object { function doIt($i,$args) { if(count($args) != 1) throw new superException("",$args); if($i instanceOf value) { $i->value= array_pop($args); return $i; } #if($i instanceOf accessor) { $i->value()->set(array_pop($args)); return $i; } return new nil(); } } class get extends object { function doIt($i,$args) { if($i instanceOf value) { if($i->isset_()) return $i->value; } if($i instanceOf accessor) { return $i->value()->get(); } return new nil(); } } class isset_ { function doIt($i,$args) { if($i instanceof value) { if(isset($i->value)) return $i->value; } return new nil(); } } class accessor extends object { function __construct() { $this->bind('value'); } function doIt($i,$args) { if(isset($args[0])) { return $this->value()->set($args[0]); } return $this->value()->get(); } } ############################################################################# try { $a= new accessor(); $a->value()->set("abc123"); echo $a->value()->get(); }catch(SuperException $e) { printf($e->getTraceAsString()." ".$e->getFile()."(".$e->getLine().")\nMessage:".$e->getMessage()."\nData:\n".var_export($e->data,1)); }