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)

Monday, March 22, 2010

Так документировать код нельзя.

Сижу поздним ночером, хочу спать, нужно чуть изменить функционал модуля. Открываю, вижу

 
/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
* @param integer the primary key value. Defaults to null, meaning using the 'id' GET variable
*/
public function loadUser()
{
if($this->_model===null)
{
if(Yii::app()->user->id)
$this->_model=User::model()->findbyPk(Yii::app()->user->id);
if($this->_model===null)
$this->redirect(Yii::app()->controller->module->loginUrl);
}
return $this->_model;
}


Ну и как это вообще называется? Я бы убивал таких документаторов.

Где exception?
Где GET?
Где param int ?
Что return ?

Я уже промолчу про шедевральный

Yii::app()->controller->module->loginUrl

В корне поменявший поведение по умолчанию.


P.S.

Понял откуда это взялось, эту документацию и метод yii генерирует в контроллере при использовании crud команды. (За исключением @param int )
 
Каталог сайтов, Добавить сайт