Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Выполнить: значения аргументов + оператор(строкой)


Автор: ressac 26.1.2008, 12:11
вообщем функция получает три переменных, две цифры и знак операции (+,-,/, ....) 
 я пробывал делать с eval() но почему-то не получается :(
может кто-то показать?

з.ы. есть возможность выполнить тоже самое но без eval(), может ещё есть какие-то функции или методы.

Автор: ressac 26.1.2008, 12:32
сделал с горем по пополам smile , забыл про ";"

Код

 echo oper($a,$b,$o);

 function oper ($a,$b,$o)
 {
    eval("\$a=".$a.$o.$b.";");
    return $a;
 }


может кто что добавит, и всё ещё интересует другой способ.

Автор: GeneralElectric 26.1.2008, 12:33
а операнды, разумеется, получаются от пользователя

Автор: Golda 26.1.2008, 13:42
eval() лучше не использовать из соображений безопасности. Вы получите гораздо больший контроль над ситуацией, в частности в обработке ошибок, если обработаете возможные варианты по отдельности. Бинарных операций не так много 

Код


function calculate($op1, $op2, $operation) {
    if (!is_numeric($op1) || !is_numeric($op2)) {
        throw new Exception('Invalid operands');
    }
    
    switch ($operation) {
        case '+':
            return $op1 + $op2;
        case '-':
            return $op1 - $op2;
        case '*':
            return $op1 * $op2;
        case '/':
            if ($op2 == 0) {
                throw new Exception('divide by zero error');
            } else {
                return $op1 / $op2;
            }
        case '^':
            if ($op1 == 0 && $op2 <= 0 || !is_int($op2)) {
                throw new Exception('Invalid operands');
            } else {
                return pow($op1, $op2);
            }
        default:
            throw new Exception('Invalid operation');
    }
}


Я не хотела сейчас возиться со случаями попыток вычисления корня четной степени из отрицательных чисел и ограничила степень целыми числами. Можете обработать эту ситуацию подробнее, если задача требует

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)