PHP的StringBuilder

52

是否有人在PHP中实现了StringBuilder


3
为什么你会想要这样的东西? - Ben
5
相关链接:php字符串连接、性能 (许多答案认为没有必要创建这样的类,但都有很好的理由) - BoltClock
1
在PHP中不需要使用StringBuilder,请参考我的回答:https://dev59.com/4nVD5IYBdhLWcg3wAGeD#16112845 - nightcoder
5个回答

98

注意:

此答案来源于2010年,现在可能已经有能够提高性能的字符串构建器(根据下面的评论判断)。我已经很长时间没有使用php了,所以我的知识已经不是最新的。这个答案可能已经过时。

以下问题也可能提供有趣的信息,尽管它们的结论似乎都是相同的。

php String Concatenation, Performance


为什么要使用StringBuilder?在php中,字符串是可变的。因此性能不是问题。

只需像这样构建字符串:

$string = "start";
$string .= "appended string";
$string .= "appended string";
etc.

12
我会+1,但是连接操作符是.=,而不是+=+=用于加法,这是与连接不同的运算符)... - ircmaxell
3
谢谢指出。太习惯用Java了 :P。现在已经修复了。 - Mark Baijens
2
是的,这真是太痛苦了 :P。每次我切换到 PHP 时,这个错误都会让我发疯。 - Mark Baijens
2
这太天真了。你不能确定地说这个;因为你需要熟悉PHP内部数据结构。我还没有看过源代码,你看过吗? - Javid
3
记录一下,PHP 中的字符串与字符串缓冲区相比,无论从任何方面来看,都不是那么快。 - Olle Härstedt
显示剩余3条评论

9
您可以使用sprintf,它是一个基本版本,但不需要额外的库。以下是示例:
$String = "Firstname %s, lastname %s, Age %d";
echo sprintf($String,"Robert","Pitt",22);

同时还处理类型转换和位置替换:

$format = "The %2$s contains %1$d monkeys. That's a nice %2$s full of %1$d monkeys.";
sprintf($format, $num, $location);

虽然我喜欢Jacob的回答的外观 :)
请看这个函数及其姐妹函数的强大功能: http://php.net/manual/en/function.sprintf.php

4
@Webnet 好处在于对于已经在翻译文件等其他位置定义的字符串来说很有用。否则它就变成了一个魔法字符串(与魔法数字的概念相同)。 - ircmaxell
L18n正是这个函数的最佳用途,也是它的字符转换姊妹函数:printf("char 65 = %c", 65); - RobertPitt

4

尽管有一些实现,但我不明白为什么你需要在PHP中使用StringBuilder,至少不是出于性能原因。在PHP中,简单的字符串连接比sprintf或Jacob提出的实现更快。


2

在PHP中,您不需要使用StringBuilder或StringBuffer,因为PHP非常方便。我向您推荐,如果您希望保留PyString,则可以使用hereDoc和NowDoc:

$YourString = "start";
$YourString .= <<<'EOD'

appended string
Example of string
spanning multiple lines
using nowdoc syntax.

EOD;

$YourString .= <<<buffer

appended string
Example of string
spanning multiple lines
using heredoc syntax.

appended string

appended string

buffer;

根据您的回答,我建议在HERE_DOC/NOW_DOC块内直接使用变量和类字段。 - Dimitry K

1

@Amir的答案给了我灵感,事实上在PHP中如果你想要“命名参数”或“位置参数”,你不需要使用sprintf,而是可以使用HERE_DOC/NOW_DOC。你甚至可以在类的属性和调用getter时使用它。

class MyClass{

     private $property;

     private $stock; // some other object with getter 'getSomeProperty()'

     function __toString(){

         $localvar = 'Localvar';
         $localvar2 = 'Localvar2';
         return <<<HERE_DOC
           {{ 
              fqsn: {$this->stock->getSomeProperty()},
              property: {$this->property},
              localvar: {$localvar},
              localvar2: $localvar2
           }}
HERE_DOC;
      } // end __toString()
 } // end MyClass

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