使用Nikic PhpParser[php]修改php文件中的数组变量



在第一个.php文件中,我分配了一些变量并定义了一些常数值,

define("CONSTANT1", "cons1value");
$variable1 = "var1value";
$variable2 = array(
"key1" => "value1",
"key2" => "value2"
);

我需要通过second.php文件更改值。这种变化可能像:

define("CONSTANT1", "cons1value_updated");
$variable1 = "var1value_updated";
$variable2 = array(
"key1" => "value1_updated",
"key2" => "value2",
"key_3_added" => "value3_added"
);

我想用Nikic PhpParser做这项工作。我试过这个代码-

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$prettyPrinter = new PhpParserPrettyPrinterStandard;
$traverser = new PhpParserNodeTraverser;
$source = file_get_contents("first.php");
try {
$stmts = $parser->parse($source);
$stmts = $traverser->traverse($stmts);
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}n";
return;
}
foreach ($stmts as $item) {
if (property_exists($item, "expr")) {
$Ex = $item->expr;
if (property_exists($Ex, "var")) {
if ($Ex->var->name == 'variable2') {
foreach ($Ex->expr->items as $fetItem) {
switch ($fetItem->key->value) {
case 'key1':
$fetItem->value->name->parts[0] = "value1_updated";
break;
case 'key2':
$fetItem->value->name->parts[0] = "value2_updated";
break;
}
}
$Ex->expr->items[] = [
"key3_added" => "value3_added"
];
}
}
}
}

一切都很好。但在部分中,

$Ex->expr->items[] = [
"key3_added" => "value3_added"
];

我犯了一个错误。有什么解决方案吗?

不能100%确定您是否使用相同版本的解析器,但问题是您正在向抽象语法树中添加一个简单的数组元素。它应该包含要创建的元素的描述,而不是数据本身。

使用nikic/php解析器4.10.4,您可以使用类似。。。

$Ex->expr->items[] = new ArrayItem(new String_("value 3 added"), new String_("key3_added"));

使用以下使用语句。。。

use PhpParserNodeExprArrayItem;
use PhpParserNodeScalarString_;

正如您所看到的,它创建了一个带有两个表达式的ArrayItem()元素,这两个表达式都是一个简单的字符串,先包含值,然后包含键。

相关内容

  • 没有找到相关文章

最新更新