Friday, March 26, 2010

Забавный php5.3

В debian testing неожиданно для меня появился 5.3, спустя час после этого "счастья", LAMP заработал как и раньше. Захотелось экспериментов, вот что в итоге получилось, на мой взгляд забавно для php.

<?php

class BaseObject extends stdClass
{
    public function 
__call($method$args = array())
    {
        return 
call_user_func_array($this->$method$args); //call closure
    
}
}

/**
 * Create className instance add getIncrementedAge, getName behaviours
 * 
 * @param string $className
 * @param integer $age
 * @param string $name
 * @return object same type as $className 
 */
function Type() 
{
    
    
$props func_get_args();
    
$className array_shift($props);//classname should be first 
    
    
$refFunction = new ReflectionFunction('Type');
    
$props array_combine(// make dictionary from function arg names (from phpdoc) and function arguments
        
array_map(//extract variable names from phpdoc @param line
            
function ($docString) { //search variable name and return it 
                
preg_match('/\$(\w+)/',$docString$data);
                return 
$data[1]; 
            },
            
array_filter//make lines array from phpdoc, filtering all except strings with @param and skip string with $className 
                
explode("\n"$refFunction->getDocComment()), 
                function (
$line
                { 
                        return 
strpos($line'param') > 0  && strpos($line'$className' ) < 1  
                } 
            ) 
        ), 
        
$props 
    
);
    
    
$ob = new $className(); 

    foreach ( 
$props as $name => $value
        
$ob->$name $value
        
    
$ob->getName = function () use($ob)  
    {
        return 
$ob->name
    };
    
    
$ob->getIncrementedAge = function ($inc =1) use($ob)  
    {
        return 
$ob->age $inc
    };
    
    return 
$ob;  
}

$cd Type('BaseObject'10,'cd');
$stas Type('BaseObject'20'stas');

var_dump($cd->getName());
var_dump($cd->getIncrementedAge(2));
var_dump($stas->getName());
var_dump($stas->getIncrementedAge(3));





Результат

php test.php
string(2) "cd"
int(12)
string(4) "stas"
int(23)

No comments:

 
Каталог сайтов, Добавить сайт