Я бы посоветовал вам прочитать немного о Составной шаблон проектирования для ваших деревьев выражений. В статье Википедии об этом есть несколько UML-диаграмм и пример кода Java, который не так сложно перевести на PHP.
Возможно, вы захотите взглянуть и на алгоритм Shunting-yard , для анализа вашей строки в дереве выражений.
Пример (очень упрощенный) PHP дерева выражений может выглядеть так:
interface INode {
public function getValue();
}
class ValueNode implements INode {
private $val;
function __construct($val) {
$this->val = $val;
}
public function getValue() {
return $this->val;
}
}
class AdditionNode implements INode {
private $op1, $op2;
function __construct($op1, $op2) {
if(!($op1 instanceof INode) or !($op2 instanceof INode)) {
throw new Exception("The operands must implement the INode interface.");
}
$this->op1 = $op1;
$this->op2 = $op2;
}
public function getValue() {
return $this->op1->getValue() + $this->op2->getValue();
}
}
$a = new ValueNode(1);
$b = new ValueNode(5);
$c = new ValueNode(10);
$add1 = new AdditionNode($a, $b);
$add2 = new AdditionNode($add1, $c);
echo $add2->getValue(); // 16
В этом случае интерфейс INode
имеет только один метод, который должен возвращать значение поддерева, укорененного в узле.
Класс ValueNode
- это простая оболочка, позволяющая числам быть частью вашего дерева выражений (фактически в PHP вы не ограничены только числами в ValueNode
). ValueNode
объекты могут служить только листовыми узлами в вашем дереве выражений.
Вы начинаете использовать составной шаблон с классом AdditionNode
, который принимает объекты INode
в качестве дочерних и может помочь вам построить дерево выражений.
Вы можете расширить этот пример, добавив другие операции, переменные, константы и т. Д., Которые будут реализовывать интерфейс INode.