PHP использует строку в качестве оператора

Скажем, у меня есть строка, $char. $char == "*".

У меня также есть две переменные, $a и $b, которые равны «4» и «5» соответственно.

Как мне получить результат $a $char $b, ie 4 * 5 ?

Спасибо :)


person Fela Maslen    schedule 25.04.2011    source источник


Ответы (6)


Вы можете использовать eval(), как предложил @konforce, однако самым безопасным маршрутом будет что-то вроде:

$left = (int)$a;
$right = (int)$b;
$result = 0;
switch($char){

  case "*":
    $result = $left * $right;
    break;

 case "+";
   $result = $left + $right;
   break;
// etc

}
person Mike Lewis    schedule 25.04.2011
comment
это ответ, который я искал :) - person Fela Maslen; 25.04.2011
comment
Рад, что смог помочь :) Удачи! - person Mike Lewis; 25.04.2011

Самый безопасный метод - это конструкция switch:

function my_operator($a, $b, $char) {
    switch($char) {
        case '=': return $a = $b;
        case '*': return $a * $b;
        case '+': return $a + $b;
        etc...
    }
}
person Marc B    schedule 25.04.2011
comment
да... люди отвечают слишком быстро! - person Fela Maslen; 25.04.2011
comment
если оператор =, ваш код выдаст sum операндов. Разве не должно быть break? - person Shakti Singh; 25.04.2011
comment
'=' в этом случае ничего не сделает, если только $a не будет передано в качестве ссылки. В противном случае присваивание будет потеряно, как только функция вернется. Это просто пример. - person Marc B; 25.04.2011
comment
@ShaktiSingh Нет необходимости в break, когда есть return - person Svish; 01.07.2012

Самый простой, но самый опасный метод — использовать eval.

$c = eval("return $a $char $b;");
person Matthew    schedule 25.04.2011
comment
Я бы предпочел не использовать eval, поскольку значения поступают от пользователя. - person Fela Maslen; 25.04.2011
comment
@konforce: Наконец-то мы должны использовать код в производстве, поэтому мы предлагаем eval - person Shakti Singh; 25.04.2011
comment
@Fela, вы должны всегда проверять ввод пользователя, независимо от того, используете ли вы eval или нет. Если вы проверяете, что $a и $b являются правильными числами и что $char является правильной операцией, то eval будет безопасным. Тем не менее, я бы все равно не использовал eval на общедоступном сайте. - person Matthew; 25.04.2011
comment
если это локальный проект, нет причин не использовать eval. - person fingerman; 25.04.2011
comment
Я не использую eval, я использую свичи с разными операторами. Весь пользовательский ввод, конечно же, дезинфицируется. - person Fela Maslen; 25.04.2011

взгляните на функцию eval(). вам нужно будет создать правильную команду php и запустить внутри eval(), чтобы извлечь результат.

person Alan Barber    schedule 25.04.2011

Вы можете использовать eval, однако я бы не советовал использовать eval.

Если есть случай, когда оператор может чем угодно, вы должны проверить, какой оператор перед использованием

switch($char)
{
  case '*':
    $result= $a * $b;
    break;

  case '+':
    $result= $a + $b;
    break;
}
person Shakti Singh    schedule 25.04.2011
comment
Да, я собираюсь пойти с этим вариантом. Спасибо :) - person Fela Maslen; 25.04.2011

person    schedule
comment
пожалуйста, объясните свое решение - person toing_toing; 03.02.2021