Динамические операторы сравнения в PHP

Действительно ли возможно, всегда, передать операторы сравнения как переменные к функции? Я смотрю на создание некоторых функций удобства, например (и я знаю, что это не будет работать):

function isAnd($var, $value, $operator = '==')
{
    if(isset($var) && $var $operator $value)
        return true;
}

if(isAnd(1, 1, '===')) echo 'worked';

Заранее спасибо.

13
задан BenTheDesigner 27 May 2010 в 07:22
поделиться

7 ответов

Как насчет небольшого класса:

class compare
{
  function is($op1,$op2,$c)
  {
     $meth = array('===' => 'type_equal', '<' => 'less_than');
     if($method = $meth[$c]) {
        return $this->$method($op1,$op2);
     }
     return null; // or throw excp.
  }
  function type_equal($op1,$op2)
  {
      return $op1 === $op2;
  }
  function less_than($op1,$op2)
  {
      return $op1 < $op2;
  }
}
10
ответ дан 1 December 2019 в 17:16
поделиться

Большая проблема в том, что эта функция довольно бессмысленна. Давайте заменим это реальным (гипотетически работающим) примером:

function isAnd($var, $value, $operator = '==') {
    return isset($var) && $var $operator $value;
}

isAnd($foo, 1, '===');

В этом примере $ foo не задано. Вы получите сообщение об ошибке, потому что пытаетесь передать несуществующую переменную ( $ foo ) в функцию ( isAnd ). Итак, вам нужно будет протестировать $ foo для isset до того, как вызовет isAnd :

isset($foo) && isAnd($foo, 1, '===');

Итак, любая переменная, которая когда-либо входит в Функция isAnd определенно установлена. Вам не нужно проверять это внутри функции. Так что все это упражнение бессмысленно.

Что может сбивать с толку, так это то, что isset () и empty () не имеют этого ограничения, т.е. вы можете передать им несуществующую переменную без ошибок. Дело в том, что это не обычные функции, это особые языковые конструкции (которые выглядят как функции; виноват PHP). К сожалению, вы не можете создавать такие конструкции, параметры для ваших функций всегда должны существовать.

Вам просто нужно привыкнуть писать isset ($ foo) && $ foo === 1 .С правильно структурированным кодом вы можете свести это к минимуму, всегда объявляя все переменные, которые вы собираетесь использовать, что в любом случае является хорошей практикой.

Для динамического оператора ... вам понадобится какая-то форма if ... else где-нибудь, чтобы решить, какой оператор использовать в любом случае. Вместо того, чтобы устанавливать переменную оператора и затем ее оценивать, не проще ли выполнить оценку прямо здесь?

3
ответ дан 1 December 2019 в 17:16
поделиться

Насколько я знаю, это невозможно, и поскольку в документации PHP нет ссылок на обратный вызов операторов, http://www.php.net/manual/en/language.operators.php

вместо использования eval, я бы переопределил каждый оператор в глобальных функциях и использовал php callbacks Как реализовать обратный вызов в PHP?

0
ответ дан 1 December 2019 в 17:16
поделиться

Нет, это невозможно. Вместо этого можно использовать условные операторы, но это будет намного, намного лучше, если вы перепроектируете свое приложение, чтобы сделать такое динамическое сравнение ненужным.

-3
ответ дан 1 December 2019 в 17:16
поделиться

Если вы абсолютно настаиваете, вы можете использовать eval .

if(isset($var) && eval("return \$var $operator \$value"))
    return true;

Но я бы не рекомендовал это.

2
ответ дан 1 December 2019 в 17:16
поделиться

Как предлагает Майкл Крелин, вы можете использовать eval, но это потенциально делает возможным множество атак путем внедрения кода.

Вы не можете подставить переменную вместо оператора, но можете подставить переменную вместо функции:

function is_equal($a, $b) {
  return $a==$b;
} 
function is_same($a, $b) {
  return $a===$b;
}
function is_greater_than($a, $b)
....

$compare='is_equal';
if ($compare($a, $b)) {
   ....

C.

1
ответ дан 1 December 2019 в 17:16
поделиться

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

35
ответ дан 1 December 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: