web-dev-qa-db-ja.com

StringBuilder for PHP

誰かがStringBuilderをPHPで実装しましたか?

45
Mark

注:

この答えは2010年のものです。今までにパフォーマンスを改善できる文字列ビルダーがあるかもしれません(以下のコメントから判断します)。私は長い間phpを使用していないため、私の知識は最新ではありません。この答えは時代遅れかもしれません。


StringBuilderを使用する理由は何ですか? PHPの文字列は変更可能です。したがって、パフォーマンスは問題になりません。

このような文字列を作成するだけです

$string = "start";
$string .= "appended string";
$string .= "appended string";
etc.
92
Mark Baijens

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);

しかし、私はジェイコブの答えの外観が好きです:)

ここで、この関数とその姉妹関数の優れた機能を見てみましょう: http://php.net/manual/en/function.sprintf.php

7
RobertPitt

実装はいくつかありますが、少なくともパフォーマンス上の理由から、PHPでStringBuilderが必要になる理由はわかりません。 PHPでのプレーンな文字列の連結は、sprintfまたはJacobが示唆した要素よりも高速です。

4
Jan Thomä

PHP、PHPはPHP $ ===は非常に便利です。

$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;
2
AMH

@Amirの回答は、PHP「名前付きパラメーター」または「位置」パラメーターが必要な場合、sprintfは必要ありませんが、HERE_DOCという事実にインスピレーションを与えました/ NOW_DOCは完璧に動作します偶数クラス内でこれを使用プロパティとゲッターを呼び出します。

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
1
Dimitry K