Difference between revisions of "Objective-PHP"
(Created page with "<code> <?="shit" ?> </code>") |
|||
Line 1: | Line 1: | ||
+ | This is something i wrote some time in 2k9 just for the hell of it | ||
<code> | <code> | ||
− | <?=" | + | <?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)); | ||
+ | } | ||
</code> | </code> |
Revision as of 22:23, 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));
}