PDO语句在PHP 7中不再有效



当我从 PHP 5.6 切换到 7.0 或 7.2 时,此语句不再有效:

$translator = new stdClass();
$sql = "SELECT name, value FROM ".$tab_translator." WHERE lang_id=:lang_id";
try {
$fetchTextTranslated = $conn->prepare($sql);
$fetchTextTranslated->bindValue(':lang_id', (int) trim($translator_lang_id), PDO::PARAM_INT);
$fetchTextTranslated->execute();
}
catch(PDOException $e) {
if ($config->debug==1) { echo 'Error: ' . $e->getMessage(); }}
while ($textTranslated = $fetchTextTranslated->fetch(PDO::FETCH_ASSOC)) {
$translator->$textTranslated['name']=$textTranslated['value'];
}

当我回显$textTranslated['name']$textTranslated['value']时,我确实从表中获取数据。但是我希望获取的数据采用 stdClass 对象$translator的形式,这在 PHP 7 及更高版本中不再有效。

我将不胜感激你的帮助。

> 我只想提一下,使用变量变量通常是次优数据存储架构的症状,但也可能存在一些边缘情况,可能会获得优势。 不过,一般来说,尽量避免变量变量。

请阅读统一变量语法

https://www.oreilly.com/ideas/upgrading-to-php7#uniform_variable_syntax

必须将动态属性包装在大括号中。

$translator->{$textTranslated['name']} = $textTranslated['value'];
//           ^-----------------------^

这消除了尝试评估线路时的潜在混淆/不一致。 同样,请参阅我链接的文档。


我的意思是,您的代码可能打算做一些完全不同的事情,例如:

您希望将数据存储为具有键name的元素,该元素位于$translator->$textTranslated属性(变量属性(中。 ...你没有,但我只是说,这个 php7 改进消除了从左到右阅读时的歧义。

作为记录,以下是替代方法的语法(您不应该将其用于您的任务(:

($translator->$textTranslated)['name'] = $textTranslated['value'];

看到区别了吗?


其他参考资料:

  • http://php.net/manual/en/language.variables.variable.php
  • https://www.engineyard.com/blog/what-to-expect-php-7
  • https://wiki.php.net/rfc/uniform_variable_syntax

最新更新