对不起,我的英语不好。
我使用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();