Если логика (выражение предиката) в переменной - PullRequest
2 голосов
/ 05 июля 2019

Я передаю оператор сравнения в качестве переменной в PHP Cli:

./test.php -k "command" -c ">0"

Команда в -k производит результат, и я сохранил его в $ result

Проблема, которую я получаю, заключается в том, что я хочу передать оператор логики и сравнения в качестве переменных, возможно ли это?

$result = 2;
$logic = ' >0';

if ( $result $logic ) echo "true"; 

Но я получаю:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданная '$ logic' (T_VARIABLE)

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 05 июля 2019

Хотя eval делает трюк, это обычно считается вредным.

Если совокупность возможных экземпляров операторов в $logic ограничена, лучше работать с оператором switch или каскадно, если:

$result = 2;
$logic = trim(' <0');

$op2 = substr($logic, 0, 2);
$op1 = substr($logic, 0, 1);

if ( $op2 == '>=') {
  $operand = substr($logic, 2);
  if ($result >= (int)$operand) { echo "true"; } 
} elseif ( $op1 == '>' ) {
  $operand = substr($logic, 1);
  if ($result > (int)$operand) { echo "true"; } 
} elseif ( $op1 == '=' ) {
  $operand = substr($logic, 1);
  if ($result == (int)$operand) { echo "true"; } 
} elseif ( $op2 == '<=') {
  $operand = substr($logic, 2);
  if ($result <= (int)$operand) { echo "true"; } 
} elseif ( $op1 == '<' ) {
  $operand = substr($logic, 1);
  if ($result < (int)$operand) { echo "true"; } 
} else {
  echo "operator unknown: '$logic'";
}
2 голосов
/ 05 июля 2019

Это невозможно сделать таким образом, но вы можете сделать это, используя метод eval , например:

$result = 2;
$logic = ' >0';


eval('$logicResult = ' . $result . $logic .';');
if ( $logicResult ) echo "true"; 

Метод eval не рекомендуется, поскольку он может привести к недостаткам безопасности в вашем приложении.

1 голос
/ 05 июля 2019

В качестве уведомления @treyBake вы можете использовать eval () - Оценить строку как код PHP :

<?php

$result = 2;
$logic = 'if(' . $result . '>0){echo "true";};';
eval($logic);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...