Класс Proposition (высказывание) служит для сохранения и извлечения логических высказываний, и используется для сохранения отношений между различными объектами сайта. Объекты, между которыми устанавливается отношение, условно называются субъект и объект. "Высказывание" - это предложение, которое либо истинно, либо ложно.
Предложение, которое содержит хотя бы одну переменную и становится высказыванием при подстановке вместо всех переменных их значений, называется высказывательной формулой. Пример высказывательной формулы: "Человек любит фрукт". В этом примере используются две переменные: человек и фрукт. При подстановке вместо переменных "человек" и "фрукт" значений "Петя" и "банан" получается конкретное высказывание: "Петя любит банан"
В качестве высказывательной формулы ($formula) используются любой текст, желательно на латинице и без пробелов. В качестве субъектов и объектов используются не наименования, а их идентификаторы в виде натуральных чисел ($subjectId, $objectId). Вопрос перевода наименований субъектов и объектов в их идентификаторы должен решать сам разработчик сайта.
Истинность или ложность высказывания фиксируется с помощью метода Proposition::set().
Proposition::set($formula, $subjectId, $objectId, true);
Если в последнем (четвертом) параметре пишется 1, то высказывание фиксируется как истинное. Если пишется 0, то высказывание примет значение "ложь" (на самом деле высказывание просто удаляется).
Допустим, человек по имени Петя имеет идентификатор 12, а фрукт в виде банана имеет идентификатор 5.
Создадим и сохраним высказывание "Петя любит банан":
Proposition::set('Человек любит фрукт', 12, 5, true);
Можно создавать высказывания, которые не устанавливают отношения между субъектом и объектом, а устанавливают какое-то свойство субъекта или объекта. То есть, не используется один из параметров: субъект или объект. В этом случае нужно вместо неиспользуемого параметра поставить значение null. Например, высказывание "Петя любит поесть", можно записать так:
Proposition::set('Человек любит поесть', 12, null, true);
В высказывании может вообще не быть ни субъекта, ни объекта, то есть, высказывание существует только в единичном экземпляре.
Proposition::set('Люди любят поесть', null, null, true);
Здесь нет никаких отношений, и по сути происходит просто сохранение булевой переменной, а для этих целей проще пользоваться классом Store.
Высказывания (истинные высказывания) извлекаются с помощью метода Proposition::get() со следующими параметрами:
$props = Proposition::get($formula, $subjectId, $objectId);
Пример:
if (Proposition::get('Человек любит фрукт', 12, 5)) echo 'Петя любит банан';
В этом примере только проверялось существование определенного высказывания. На самом деле метод Proposition::get() возвращает массив, где один из элементов выглядит, например, так:
0 => ['subject-id' => 12, 'object-id' => 4]
При извлечении высказываний вместо идентификаторов субъекта или объекта можно подставлять значение "all" или "any".
Если в предыдущем высказывании вместо определенного фрукта, указать "all" то можно узнать все фрукты, которые любит Петя:
$props = Proposition::get(('Человек любит фрукт', 12, 'all')); /* Будет выведен например, такой массив: 0 => ['subject-id' => 12, 'object-id' => 4] 1 => ['subject-id' => 12, 'object-id' => 5] 2 => ['subject-id' => 12, 'object-id' => 6] */
Аналогично можно узнать всех людей которые любят бананы:
$props = Proposition::get('Человек любит фрукт', 'all', 5);
Можно узнать, имеется ли хотя бы один человек, который любит есть бананы:
if (Proposition::get('Человек любит фрукт', 'any', 5)) echo 'есть человек, который любит банан';Вместо значения "any" можно конечно применять и значение "all", но с "any" метод сработает быстрее.
А вот так можно получить список всех людей которые любят хотя бы один фрукт:
$props = Proposition::get('Человек любит фрукт', 'all', 'any');
Так же как и в случае сохранением высказываний, возможны высказывания без субъекта и объекта. На этот раз, если ненужный параметр стоит в конце, null можно не писать, а просто опустить параметры:
$props = Proposition::get('Люди любят поесть', null, null);
$props = Proposition::get('Люди любят поесть');
В параграфе "Сохранение высказываний" было показано, что удалить высказывание, можно присвоив высказыванию значения "ложь":
Proposition::set('Человек любит фрукт', 12, 5, false);
То же самое можно сделать с помощью метода Proposition::delete(). Однако, возможности этого метода шире, с его помощью можно удалить те только одно высказывание, но и высказывания, удовлетворяющие определенному признаку.
Например, указав в качестве идентификатора фрукта "all", можно удалить все высказывания о фруктах, которые любит Петя:
Proposition::delete('Человек любит фрукт', 12, 'all');
Система управления сама использует класс Proposition. По этой причине нельзя использовать следующие высказывательные формулы.
Высказывательные формулы с субъектом и объектом
Высказывательные формулы только с субъектом
Высказывательные формулы без субъекта и без объекта