The object oriented javascript style php class definition for PHP 5.3
#!/usr/bin/php
<?php
/**
* Mootools-style php scripting at version 5.3
* Hash-based class definition, avoiding namespaces
*/
#################################################################################
# Start Core
#################################################################################
class P{
private static $map;
private static $current_class;
public function mclass($class_name, $class_hash){
$class_name = self::clean_class_name($class_name);
self::$map["$class_name"] = $class_hash;
#a hook after the class has been made
print "The class $class_name has been made!\n";
}
/**
* create a singleton of the P object
*/
public function getInstance($class_name){
static $instance;
$class_name = self::clean_class_name($class_name);
self::$current_class = $class_name;
if(!is_object($instance)){
$instance = new P();
}
return $instance;
}
public static function this(){
return self::getInstance(self::$current_class);
}
public function __call($name, $params = array()){
$map = self::$map;
$current_class = self::$current_class;
if(array_key_exists($name, $map[$current_class]) && !in_array($name, self::getPreservedWords())){
if(count($params) > 0){
$map[$current_class][$name]($params[0]);
}
else{
$map[$current_class][$name]();
}
}
else{
print "Method $name in class $current_class does not exist!\n";
}
}
private static function clean_class_name($class_name){
$class_name = trim($class_name);
#make class name less error-prone
$class_name_comps = @explode(">",$class_name);
$class_name_comps_length = count($class_name_comps);
for($k = 0; $k < $class_name_comps_length; $k++){
$class_name_comps[$k] = trim($class_name_comps[$k]);
}
$class_name = @implode(">",$class_name_comps);
return $class_name;
}
/**
* Preserved key words
*/
private static function getPreservedWords(){
return array(
'public','private','protected','extends','variables','implements'
);
}
}
/**
* The O function, return a P::getInstance
*/
function O($class_name){
return P::getInstance($class_name);
}
/**
* The C function, same as P::mclass
*/
function C($class_name, $class_hash){
P::mclass($class_name, $class_hash);
}
########################################################################################
# End Core
########################################################################################
/* define a class */
C('Car', array(
//define "class" variables
'variables' => array(
),
//access control, default function is protected
'public' => array(), # an array of public methods
'private' => array(), # an array of private methods
'extends' => 'ObjectBase', #we can extends one base class
'implements' => array('Observable, Sortable'), #implements an array of interface
'hello' => function($params){
P::this()->greet($params);
},
'greet' => function($params){
print "greeting from Car\n";
},
));
C('Car > Japanese', array(
'hello' => function(){
print "hello from a japanese car\n";
}
));
/* we can achieve class overriding here, which is not possible in normal php class definition */
/*
C('Car', array(
'hello' => function($params){
P::this()->greet($params);
},
'greet' => function($params){
print "greeting from car in second\n";
},
));
*/
C('Car > American', array(
'engine' => function(){
print "American Car Engine\n";
},
));
$car = O('Car');
$car->hello(array('size' => 10));
$car->greet(array());
$car = O('Car > Japanese');
$car->hello();
$car->bar();
O('Car > American')-> engine();
O('Car')->public();
//we might achieve dynamic extend and implement !!!
- Login to post comments