如何在EvalMath类(PHP)中堆叠多个变量和函数


How to stack up many vars and functions in EvalMath class (PHP)?

对不起,我的英语不好。

我使用EvalMath类(http://www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematical-expressions.html)来构建一个化学函数解释器。

这个类工作得很好:

$math->evaluate("xx = 2");
$math->evaluate("yy = 2");
$math->evaluate("zz = xx + yy");
echo $math->evaluate("zz"); //print 4

但是我需要这个:

$math->evaluate("xx = 2");
$math->evaluate("zz = xx + yy"); //yy is undefined
$math->evaluate("yy = 2");
echo $math->evaluate("zz"); //empty

我的变量和函数在一个数据库中,有几百个,所以我不能指定函数的顺序。因此,我需要累积变量值,以便仅在特定时间(最后)计算。

我认为答案一定在于在课堂上使用'$this->v[]'变量,但我没有足够的知识来修复它。

有人能帮我吗?

查看这个类,它的值似乎是在称为->evaluate的点处求值的。

如果你真的不关心效率,把你的代码包围在一个循环中,调用它的次数和你有语句的次数一样多(这个数字只适用于最坏的情况,每次只有最后一个语句被接受,为了改进它,你可以在队列中记录那些失败的,如果失败的话重新添加到队列中,并继续直到空)。

for ($i =0; $i <3; $i++){
    $math->evaluate("xx = 2");
    $math->evaluate("zz = xx + yy"); //yy is undefined
    $math->evaluate("yy = 2");
}
echo $math->evaluate("zz"); //empty

您将得到错误,因此您可以在调用$math->suppress_errors = true;之前使用它。请注意,这是非常低效的,但如果您想在不修改该类的情况下仍然使用它,这可能是唯一的方法。

如果所有的语句都这么简单,你可能可以很简单地实现自己的解析器,并将每个定义存储在映射中,然后编写一个evaluate方法,最后递归求值。

$c["xx"] = new literal(2);
$c["zz"] = new plus("xx", "yy", $c);
$c["yy"] = new literal(2);

class plus {
    var $a;
    var $b;
    var $array;
    function __construct($a, $b, &$c) {
        $this->a = $a;
        $this->b = $b;
        $this->array = &$c;
    }
    public function evaluate() {
        return 
                $this->array[$this->a]->evaluate() 
                +
                $this->array[$this->b]->evaluate();
    }
}
class literal {
    var $a;
    function __construct($a) {
        $this->a = $a;
    }
    public function evaluate() {
        return $this->a;
    }
}
echo $c["zz"]->evaluate();