PHP - 在字符串中连接或直接插入变量
Posted
技术标签:
【中文标题】PHP - 在字符串中连接或直接插入变量【英文标题】:PHP - concatenate or directly insert variables in string 【发布时间】:2011-08-02 03:13:49 【问题描述】:我想知道,将 php 变量插入字符串的正确方法是什么? 这样:
echo "Welcome ".$name."!"
或者这样:
echo "Welcome $name!"
这两种方法都适用于我的PHP v5.3.5
。后者更短更简单,但我不确定第一个格式是否更好或更合适。
【问题讨论】:
如果你是第一个,我个人更喜欢单引号echo 'Welcome '.$name.'!';
php.net/manual/en/…
@kjy112 我在回答中说了同样的话,我是单引号的超级粉丝:X
就个人而言,我忽略了整个“单引号更有效”,而只是选择“使用需要最后一部分内部转义的任何引用样式”。由于字符串解析相对较少,因此您编写的任何代码都不太可能从任何 MICROSCOPIC 收益中受益。增加字符串连接。
性能损失索赔是假的。参考这篇文章:nikic.github.io/2012/01/09/…
【参考方案1】:
在这两种语法之间,你应该选择你喜欢的一种:-)
就个人而言,在这种情况下,我会选择您的第二种解决方案(变量插值),我发现它更易于编写和阅读。
结果是一样的;即使存在性能影响,这些也无关紧要 1。
作为旁注,所以我的回答更完整一点:你想做这样的事情的那一天:
echo "Welcome $names!";
PHP 将解释您的代码,就像您尝试使用不存在的 $names
变量一样。
- 请注意,只有在字符串中使用 "" 而不是 '' 时它才会起作用。
那天,你需要使用:
echo "Welcome $names!"
无需回退到串联。
另请注意,您的第一个语法:
echo "Welcome ".$name."!";
可能优化,避免串联,使用:
echo "Welcome ", $name, "!";
(但是,正如我之前所说,这并不重要......)
1 - 除非您进行数十万次串联与插值 - 情况可能并非如此。
【讨论】:
太好了,谢谢!很高兴知道我可以使用我最喜欢的方法将它直接插入到字符串中,我非常感谢现在知道如何在需要使用
时将变量与其他字符串分开。
请注意,用逗号分隔字符串文字和变量仅适用于echo
,不适用于其他任何地方。
只是指出性能:time php -r '$string=""; for ($i=0;$i<199999;$i++) $string = $string.$i; print("Done!\n");'
(连接)实际上损失了大约 300 毫秒(对于 200.000 个项目,这是您集合中每千个元素 1 miliseconf ......)。那是统计噪音,甚至无法测量任何差异。考虑到它更具可读性,time php -r '$string=""; for ($i=0;$i<199999;$i++) $string = "$string$i"; print("Done!\n");'
(插值)是无可争议的赢家……
如果要使用插值,则必须使用双引号。
是否可以在字符串中使用函数?像 echo "This is foo() nice"; ?【参考方案2】:
双引号字符串更优雅,因为您不必在每次需要插入变量时分解字符串(就像您必须使用单引号字符串一样)。
但是,如果您需要插入函数的返回值,则不能将其插入双引号字符串中——即使您用大括号将其括起来!
//syntax error!!
//$s = "Hello trim($world)!"
//the only option
$s = "Hello " . trim($world) . "!";
【讨论】:
您可以通过 PHP 5.3 变量函数将函数半间接地插入到字符串中。$x = function() ...; $string = "hello $x(blah blah blah)"
,围绕“限制”工作。
@Marc 太酷了,我不知道!您还可以将现有函数的名称分配给变量并执行相同的操作:$x = 'trim'; $string = "hello $x('blah blah blah')";
这很酷,但非常不可读,所以无论如何都必须避免它。
$s = 'Hello ' . trim($world) .'!';
尝试在字符串中没有插入任何内容时使用单引号。这将提高性能并且可以用作识别两者的约定【参考方案3】:
从 php4 开始你可以使用字符串格式化程序:
$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);
来源:sprintf()
【讨论】:
迄今为止最安全的选择。 +1 用于匹配其他语言的良好做法和一般约定【参考方案4】:我一直更喜欢这个,发现它更容易。
echo "Welcome $name!"
【讨论】:
【参考方案5】:从使思想简单、可读、一致和易于理解(因为性能在这里无关紧要):
当您想要嵌入对象属性、多维数组等时,在双引号中使用嵌入的变量可能会导致复杂和混乱的情况。 也就是说,通常在读取嵌入式 var 时,您无法立即 100% 确定所读取内容的最终行为。
您经常需要添加诸如 和
\
之类的拐杖,这会增加混乱并使串联可读性几乎相同,甚至更好。
当您需要在 var 周围包装函数调用时,例如 htmlspecialchars($var)
,您必须切换到串联。
AFAIK,您不能嵌入常量。
在某些特定情况下,“嵌入 vars 的双引号”可能很有用,但一般来说,我会选择 连接(方便时使用单引号或双引号)
【讨论】:
【参考方案6】:我知道这个问题已经有一个选择的答案,但我发现this article 显然表明字符串插值比串联工作得更快。这可能对那些仍有疑问的人有所帮助。
【讨论】:
【参考方案7】:任何一个都可以。使用对您有更好可见性的那个。说到知名度,您还可以查看printf。
【讨论】:
【参考方案8】:不要连接。不需要,我们逗号作为echo可以带多个参数
echo "Welcome ", $name, "!";
关于使用单引号或双引号,差异可以忽略不计,您可以使用大量字符串进行测试以自己测试。
【讨论】:
不过,这仅适用于 echo。尝试进行变量赋值,然后观察您的代码崩溃。【参考方案9】:使用第一个并使用单引号!
-
它更易于阅读,这意味着其他程序员会知道发生了什么
它的运行速度稍快,就像 PHP 剖析您的源代码时创建操作码的方式一样,无论如何它基本上都会这样做,所以请帮帮它!
如果您还使用单引号而不是双引号,您将进一步提高性能。
您应该使用双引号的唯一情况是您需要\r
、\n
、\t
!
开销只是不值得在任何其他情况下使用它。
您还应该查看PHP variable concatenation、phpbench.com 以了解有关不同处理方法的一些基准。
【讨论】:
-1:使用单引号对性能没有任何实际影响。链接页面以 微秒 为单位显示两种方法之间的差异,即 0.000001 秒。任何数据库查询都将花费数百倍的时间。这种争论完全没有意义。 提及\r
、\n
和\t
的好点,因为其他答案不包括这一点。【参考方案10】:
这只是口味的问题。 随心所欲地使用。
大部分时间我都在使用第二个,但这取决于。
我建议你也给自己一个好的编辑器,它会突出显示字符串中的变量
【讨论】:
我已经获得了所需的文本区域。 PSPad 摇摇欲坠。【参考方案11】:如果你想执行SQL
命令并且你的变量是数组成员,那么你不应该在数组的[]
中使用单引号(比如:['']
);例如,如果你使用这个字符串作为 SQL 命令,你会得到server error 500
:
$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')
//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)
正确的字符串是:
//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";
【讨论】:
你应该使用 PDO 来代替【参考方案12】:你应该选择第一个。除了第一个比第二个的性能更快之外,它们没有区别。
如果PHP双引号内的变量需要时间来解析变量。
看看这个Single quotes or double quotes for variable concatenation?
这是另一个例子Is there a performance benefit single quote vs double quote in php?
我不明白为什么上面链接中的这个答案会被赞成,为什么这个答案会被反对。
正如我所说的一样。
你也可以看看这里
What is faster in PHP, single or double quotes?
【讨论】:
-1 用于过早优化。除非您在一个脚本中打印数百万次,否则性能差异不足以成为一个因素——即便如此,您所做的任何其他处理都会使您可能花在以一种方式而不是另一种方式打印的额外几秒钟相形见绌.它们之间的主要区别在于可读性(这导致我更喜欢第二种风格)。 我可以试着回答你最后一个问题。 PHP 社区有很多谣言,其中一些非常强大。披露它们非常困难并且需要时间。但慢慢地它正在改变。所以,你链接到的答案是旧的,从人们不关心的时候开始。而在这篇文章中,有些人是根据自己的经验来回答的,而不是他们读过的文章。 性能损失为假+1 @cHao。这是一篇带有证明它的指标的文章。 nikic.github.io/2012/01/09/…【参考方案13】:我知道这是一个老问题,但我认为有人必须提及所有优点和缺点:
更好的语法:这是个人喜好。
性能:没有区别。正如许多人提到的,如果使用不切实际的许多变量,双引号可能会更快。
更好的用法:单引号(大部分)。正如@Khez 所说,使用单引号可以连接任何内容,甚至是函数调用和变量修改,例如:echo 'hi ' . trim($name) . ($i + 1);
。双引号唯一能做而单引号不能做的就是使用\n
、\r
、\t
等。
可读性:没有区别(可能有个人偏好)。
Writability/Re-Writability/Debugging:在 1 行语句中没有区别,但在处理多行时,在调试或编写时更容易注释/取消注释行。例如:
$q = 'SELECT ' .
't1.col1 ' .
',t2.col2 ' .
//',t3.col3 ' .
'FROM tbl1 AS t1 ' .
'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
//'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
'WHERE t1.col1 = ' . $x . ' ' .
' AND t2.col2 = ' . $y . ' ' .
//' AND t3.col3 = ' . $z . ' ' .
'ORDER BY t1.col1 ASC ' .
'LIMIT 10';
少转义:单引号。对于单引号,您只需转义 2 个字符('
和 \
)。对于双引号,您需要转义 2 个字符("
、\
),如果需要,还需要转义 3 个字符($
、 和
)。
Less Changes:单引号。例如,如果您有以下代码:
echo 'Number ' . $i . '!';
并且你需要将 1 增加到 $i,所以它变成了喜欢:
echo 'Number ' . ($i + 1) . '!';
但是对于双引号,你需要改变这个:
echo "Number $i!";
到这里:
echo "Number " . ($i + 1) . "!";
结论:用你喜欢的。
【讨论】:
【参考方案14】:我使用点 (.) 来连接字符串和变量。像这样-
echo "Hello ".$var;
有时,我使用花括号连接字符串和变量,看起来像这样-
echo "Hello $var";
【讨论】:
以上是关于PHP - 在字符串中连接或直接插入变量的主要内容,如果未能解决你的问题,请参考以下文章