Как построить динамическое условие в PHP?

324
30 апреля 2017, 00:32

Пытаюсь сделать калькулятор. Есть массив правил, в котором описано какая переменная должна быть <,>,=,!= итд какому то значению, например:

["sum",">","20"]

выражение составляет пользователь и что он туда пропишет неизвестно заранее. То есть может пояявится например:

["sum",">","20"]
["sum","!=","30"]
["sum","=>","777"]

а мне в свою очередь нужно взять этот массив и составить правило, по которому я должен искать значения, например:

if ($sum > 20){правило сработало, чтото делаем}
if ($sum != 30){правило сработало, чтото делаем}
if ($sum => 777){правило сработало, чтото делаем}

это вообще реально решить? У меня опыта не хватает :-)

Answer 1

Если делать в ООП стиле, то Вам необходимо описать новый тип данных, который будет представлять Ваши правила, как Вы их называете.

Например:

<?php 
interface RuleInterface {
     /**
     *@return bool
     */
     public function resolve();
}

И конкретные реализации этих правил, например:

Equal.php
<?php
class Equal implements RuleInterface {
   private $a;
   private $b;
   public function __construct($a, $b)
   {
     $this->a = $a;
     $this->b = $b;
   }
   public function resolve($a, $b)
   {
     return $a === $b;
   }
}
GreaterThan.php
<?php
class GreaterThan implements RuleInterface {
   private $a;
   private $b;
   public function __construct($a, $b)
   {
     $this->a = $a;
     $this->b = $b;
   }
    public function resolve()
    {
      return $a > $b;
    }
}

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

Фабрика:

<?php
interface RulesFactory {
  /**
  *@param array $input
  *@return RuleInterface 
  */
  public function createRule(array $input);
}

<?php
class SimpleRulesFactory implements RulesFactory {
  public function createRule($array $input)
  {
    swith($input[1]) {
      case '=' :
        return new Equal($input[0], $input[2]);
      case '>' :
        return new GreaterThan($input[0], $input[2]);
      default :
        throw new Exception(); 
    }
  }
}

Пример:

<?php
$sum = 25;
$input = [
  [$sum, '>', 20],
  [$sum, '=', 25]
];
$factory = new SimpleRulesFactory();
foreach ($input as $row) {
  $rule = $factory->create($row);
  if ($rule->resolve()) {
    // правило сработало, что-то делаем
  }
}
READ ALSO
yii2 валидация формы

yii2 валидация формы

Есть форма, где динамический формируется поляПроблема в том что не работает валидация полей на клиентской части

595
Как получить значение из функции и вывести в объект?

Как получить значение из функции и вывести в объект?

Как вывести значение $username & $photos из функции в $dataToBePassed (сейчас выводит null):

258
Создание thumbnail для записи

Создание thumbnail для записи

Подскажите, допустим с помощью парсера получаю url картинки на сайте, с которого нужно скопировать картинкиИ нужно создать thumbnail для определённой...

225
Denwer и mkdir() функция

Denwer и mkdir() функция

На локальном хостинге использую denwer, пытаюсь создать папку с помощью функции mkdir(), ошибку не выдаёт но и ни чего не создаётМожет в php

287