web-dev-qa-db-fra.com

StringBuilder pour PHP

Quelqu'un a-t-il fait une implémentation de StringBuilder en PHP?

45
Mark

Remarque:

Cette réponse date de 2010, il pourrait y avoir des constructeurs de cordes qui peuvent améliorer les performances maintenant (à en juger par les commentaires ci-dessous). Je n'ai pas travaillé avec php depuis longtemps donc mes connaissances ne sont pas à jour. Cette réponse est peut-être dépassée.


Pourquoi voulez-vous utiliser un StringBuilder? Les chaînes en php sont mutables. Par conséquent, les performances ne sont pas un problème.

Construisez simplement une chaîne comme celle-ci

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

Vous pouvez utiliser sprintf qui n'est qu'une version de base mais ne nécessite aucune bibliothèque supplémentaire, exemples

$String = "Firstname %s, lastname %s, Age %d";
echo sprintf($String,"Robert","Pitt",22);

Et gère également la fonte de type et les remplacements de position:

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

Bien que j'aime le look de la réponse de jacob :)

preneur un coup d'oeil à la grande fonctionnalité de t sa fonction et sa fonction sœur ici: http://php.net/manual/en/function.sprintf.php

7
RobertPitt

Il existe quelques implémentations, mais je ne vois pas pourquoi vous auriez besoin d'un StringBuilder en PHP, du moins pas pour des raisons de performances. Concaténation de chaînes simples en PHP est plus rapide que sprintf ou l'impelementation suggérée par Jacob.

4
Jan Thomä

Vous n'avez pas besoin de StringBuilder ou StringBuffer dans PHP, PHP est super pratique, je vous le propose, en utilisant hereDoc et NowDoc si vous souhaitez conserver PyString:

$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

Réponse de @Amir, m'a inspiré le fait qu'en PHP si vous voulez des paramètres 'named parameters' ou 'positional', vous n'avez pas besoin de sprintf, mais HERE_DOC/NOW_DOC fonctionne parfaitement. Vous pouvez mêmetiliser ceci à l'intérieur d'une classe pour les propriétés et les appelants.

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