我有一个包含对象和数组的复杂对象。这里发布数据对象太大了(在我的课程中定义为$ this->数据)。我还有一个简单的配置文件" {{name.something}}"模板表达式。我试图编写一个简单的表达式解析器来解析配置字符串,例如" {{patient.firstname}}"。
示例表达式:
{{patient.firstname}},{{patient-> firstname}}或甚至{{patient.customfields [0] .customfieldvalue}}
以下代码似乎运作良好。既然我已经开始工作了,我就会质疑eval()函数的用法和安全性。配置文件不包括任何用户输入的数据。这段代码安全吗?有没有办法在没有eval()的情况下重写它?
<?php
// Note - This is only part of the class.
/*
* Parse Template Value Expressions
* Allows complex object data to be used. Examples:
* {{patient.firstname}}, {{patient->firstname}} or even {{patient.customfields[0].customfieldvalue}}
*/
private function _parseDataValue($value = '') {
// Parse Template Expressions: Allows data input to be used {{name}}, {{name1.name2}}, etc
if ($value != '' && preg_match('/\{\{([a-z0-9\-_\[\]\>\.]+)\}\}/i', trim($value))) {
$value = preg_replace_callback('/\{\{([a-z0-9\-_\[\]\>\.]+)\}\}/i',
array(&$this, '_buildDataCallback'), trim($value));
}
return $value;
}
/*
* Parse Template Value Expressions Callback Method
*/
private function _buildDataCallback($matches) {
$out = '';
if (isset($matches[1])) {
$var = $matches[1];
@eval("\$out = \$this->data->$var;");
}
return $out;
}
?>
答案 0 :(得分:1)
您可以使用花括号来获取具有变量名称的对象属性。
(PHP dynamic name for object property)
我认为这会取代您对 <?php
$out = $this->data->{$var};
的使用:
viewController