evaluateExpression и create_function

Уже исправленные репорты или принятые предложения
Ответить
Аватара пользователя
skillz
Сообщения: 5
Зарегистрирован: 2013.03.28, 15:17
Откуда: Нижний Новгород

evaluateExpression и create_function

Сообщение skillz » 2013.07.24, 23:15

Когда использовал CGridView, столкнулся с такой проблемой.
При на расширенной настройке CDataColumn вызывается CComponent ::evaluateExpression($_expression_,$_data_=array()), который отваливается, если в $_expression_передавать не string или array, а функцию созданную при помощи create_function.
PHP вываливает что-то вроде Warning: Unexpected character in input: ' in /var/www/yii/framework/base/CComponent.php(612) : eval()'d code on line 1

Код: Выделить всё

    
public function actionTest()
{
    $func = create_function('$data', '{print_r($data);}');
    $this->evaluateExpression($func);
}
В исходниках evaluateExpression следующее:

Код: Выделить всё

public function evaluateExpression($_expression_,$_data_=array())
{
    if(is_string($_expression_))
    {
        extract($_data_);
        return eval('return '.$_expression_.';');
    }
    else
    {
        $_data_[]=$this;
        return call_user_func_array($_expression_, $_data_);
    }
}
 
Ну и суть:
Дело в том, что функция, созданная через create_function ( предположительно и анонимные тоже) являются хоть и callable, но все таки типом string.
Поэтому if(is_string($_expression_)) срабатывает и eval пытается вывести функцию, а не вызвать ее.
Я вот никак и не пойму это баг или фича. Мол в случае с CGridView юзай наследование от форматеров, а не какие-то там лябда-функции)

Аватара пользователя
samdark
Администратор
Сообщения: 8694
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: evaluateExpression и create_function

Сообщение samdark » 2013.07.24, 23:26

Лямбды 5.3 с гридами точно работают.

Аватара пользователя
skillz
Сообщения: 5
Зарегистрирован: 2013.03.28, 15:17
Откуда: Нижний Новгород

Re: evaluateExpression и create_function

Сообщение skillz » 2013.07.25, 00:38

Лямбды да, робят, но их нет в 5.2, есть только create_function
Вопрос то собственно с точки зрения разработки ядра, почему именно if(is_string($_expression_)) а не if(is_string($_expression_) && !is_callable($_expression_)) к примеру?

Аватара пользователя
samdark
Администратор
Сообщения: 8694
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: evaluateExpression и create_function

Сообщение samdark » 2013.07.25, 11:24

Проверка на строку значительно быстрее, что может быть критично для больших гридов. Для 5.2 можно использовать сразу строки без create_function.

Ответить