per qualcuno sembrerà una bestemmi, io ne vedo invece una buona utilità
la classe aggregante:
Codice PHP:
<?php
class aggregation{
public function __construct(){
$classes =func_get_args();
$code="";
foreach($classes as $class){
$file=file_get_contents($class.'.php');
$parsed=$this->parse_class($file);
$code.=($parsed['code']!= false)?"\n{$parsed['code']}\n":"";
}
$this->code=$code;
return $this;
}
public function compiled(){
$className="lambda___".rand(123456789,987654321);
$outClass=eval("class {$className} {\n {$this->code} \n}");
return new $className;
}
final private function parse_class($content){
$out=array('name'=>false,'code'=>false);
$class_name_def = '[a-z_\x7f-\xff][a-z0-9_\x7f-\xff]*';// e' la definizione corretta di un nome di classe
$reg = '/class[\s]{1,}('.$class_name_def.')[\s]*?(?:[\s]{1,}extends[\s]{1,}('.$class_name_def.')[\s]*?)?{(.*?)}/Usmi';
preg_match($reg,$content,$check);
if(!empty($check) && isset($check[1]) && isset($check[3])){
$out['name']=$check[1];
$out['code']=$check[3];
}
//var_dump($out);
return $out;
}
}
?>
le classettine di test separate nei rispettivi files
Codice PHP:
<?php
class a{
private $a=10;
public function get_a(){
return $this->a;
}
public function set_a($val){
$this->a=$val;
return $this;
}
}
?>
<?php
class b{
private $b=20;
public function get_b(){
return $this->b;
}
public function set_b($val){
$this->b=$val;
return $this;
}
}
?>
<?php
class c{
private $c=30;
public function get_c(){
return $this->c;
}
public function set_c($val){
$this->c=$val;
return $this;
}
}
?>
e il test di tutto
Codice PHP:
<?php
include('aggregator.php');
$agg= new aggregation('a','b','c');
$test=$agg->compiled();
echo $test->get_b();
?>