PHP eval函数及性能

4

我正在创建一个 Web 应用程序,在其中希望将所有用户响应存储在语言文件中以便于编辑。因此,我使用 eval() 来管理动态消息,如下所示:

$msg = 'Hello $user, your favorite color is $color';

$colors =  array("red","green","blue","yellow");
$users =  array("bob","craig","ted","dirty sanchez");

foreach($users as $key => $user){

 $color = $colors[$key];
 eval("\$newmsg = \"$msg\";");
 echo $newmsg;


}

我在想这是最好的方法吗?还是有更好的方法?

5个回答

10

如非必要,请勿使用那该死的eval!你的代码将无法正常工作,应该使用sprintf来实现你的目的。

$messageFormat = 'Hello %s, your favorite color is %s';

$colors =  array("red","green","blue","yellow");
$users =  array("bob","craig","ted","dirty sanchez");
foreach($users as $key => $user){
   $color = $colors[$key];
   $actualMessage = sprintf($messageFormat, $user, $color);
   echo htmlentities($actualMessage);
}

假设您将此用于评论或其他用户提供的文本,我已添加htmlentities()以防止跨站脚本攻击


2
@websiteguru:如果可以避免使用eval,那么有两个原因: a)它存在安全风险。eval允许执行PHP。如果用户能够将恶意输入混入eval中,他就可以执行PHP(从而几乎完全控制您的服务器)。 b)eval很慢,真的很慢。而且eval代码很难理解。即使我自认为是一名经验丰富的PHP开发人员,也需要一些时间才能理解您的代码,而Lekensteyn的代码非常清晰明了。 - NikiC

2
你需要的是printf函数。 你可以定义一个字符串,并使用%s作为字符串的占位符。 然后调用。
printf($variable, $string1, $string2, $string);

第一个%s会被$string1替换,以此类推。

在你的例子中,我会使用vsprintf,它返回字符串,并且你可以给它一个数组,这样你就可以输入任何参数和输入字符串的数组。

这是你的例子:

   <?
$msg = 'Hello %s, your favorite color is %s';
$colors =  array("red","green","blue","yellow");
$users =  array("bob","craig","ted","dirty sanchez");
foreach($users as $key => $user){
 $color = $colors[$key];
 $newmsg = vsprintf($msg,array($user,$color));
 echo $newmsg."\n";
}

?>

0
我更喜欢这种方式:
<?php

$msg = 'Hello [USER], your favorite color is [COLOR]';

$colors =  array("red","green","blue","yellow");
$users =  array("bob","craig","ted","dirty sanchez");

foreach($users as $key => $user)
{
    $color = $colors[$key];

    $newmsg = str_replace(array('[USER]', '[COLOR]'), array($user, $color), $msg);
    echo $newmsg;
}
?>

虽然不是我在寻找的,但这很有趣。如果有大量变量使用,这与sprintf解决方案的性能比较如何? - websiteguru

0
$colors =  array("red","green","blue","yellow");
$users =  array("bob","craig","ted","dirty sanchez");
$messages = array_combine($colors, $users);

foreach ($messages as $color => $user)
{
     echo "Hello $user, your favourite color is $color";
}

使用 array_combine 函数创建格式为 $keys => $values 的数组,生成以下数组:
"red" => "bob",
"green" => "craig",
"blue" => "ted",
"yellow" => "dirty sanches"

0

您可以使用strtr函数

$msg = 'Hello @user, your favorite color is @color';
echo strtr($msg, array('@user'=>'bob', '@color'=>'red'));

输出:

Hello bob, your favorite color is red

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接