2010-11-18 10 views
36

Est-ce que quelqu'un a fait une implémentation StringBuilder en PHP?StringBuilder pour PHP

+3

Pourquoi voudriez-vous quelque chose comme ça? – Webnet

+4

En relation: [Concaténation de chaînes php, Performance] (http://stackoverflow.com/q/124067/106224) (beaucoup de réponses rejettent le besoin d'une telle classe, mais toutes avec de bonnes raisons) – BoltClock

+1

Vous ne le faites pas besoin de StringBuilder en PHP, voir ma réponse: http://stackoverflow.com/questions/124067/php-string-concatenation-performance/16112845#16112845 – nightcoder

Répondre

85

Note:

Cette réponse est à partir de 2010, il pourrait y avoir stringbuilders qui peut améliorer la performance 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 pourrait être périmée.


Pourquoi voulez-vous utiliser un StringBuilder? Les chaînes de php sont mutables. Par conséquent, la performance n'est pas un problème.

Il suffit de construire la chaîne comme celui-ci

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

Je voudrais +1, mais l'opérateur de concaténation est '. =', pas '+ =' ('+ =' est utilisé pour addition, qui est un opérateur différent de la concaténation) ... – ircmaxell

+2

oups, merci de le signaler.Pour beaucoup utilisé pour Java: P. Le fixe maintenant. –

+0

oui je l'ai remarqué aussi, du langage C :) – RobertPitt

6

Vous pouvez utiliser sprintf qui est seulement une version de base, mais ne nécessite pas de bibliothèques supplémentaires, des exemples Suivez

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

et poignées également coulée de type et de remplacement position:

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

Tous si je aime le regard de la réponse de jacob :)

prendre un coup d'oeil à la grande fonctionnalité de t sa fonction et sa fonction soeur ion ici: http://php.net/manual/en/function.sprintf.php

+0

Je n'ai jamais compris l'utilité de cette fonction dans ce genre de méthode. – Webnet

+4

@Webnet Eh bien, c'est bon pour les chaînes qui sont définies ailleurs (comme dans un fichier de traduction). Sinon, il ne devient rien de plus qu'une chaîne magique (qui est le même concept qu'un [nombre magique] (http://en.wikipedia.org/wiki/Magic_number)) – ircmaxell

+0

L18n est exactement le meilleur usage pour cette fonction et aussi son fonction soeur pour les conversions char: 'printf (" char 65 =% c ", 65);' – RobertPitt

4

Il y a quelques implémentations là-bas, mais je ne vois pas pourquoi vous auriez besoin d'un StringBuilder en PHP, au moins pas pour des raisons de performance. La concaténation en chaîne de caractères en PHP est plus rapide que sprintf ou l'implémentation de Jacob suggérée.

2

Vous n'avez pas besoin StringBuilder ou StringBuffer en PHP, PHP est super pratique, je vous offre, à l'aide de heredoc et Nowdoc si vous 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; 
+0

en fonction de votre réponse, j'ai fait une suggestion d'utiliser des variables et des champs de classe à l'intérieur du bloc HERE_DOC/NOW_DOC. –

1

Réponse de @Amir, m'a donné l'inspiration au fait qu'en PHP si vous voulez des paramètres "nommés" ou "positionnels", vous n'avez pas besoin de sprintf, mais HERE_DOC/NOW_DOC fonctionne parfaitement. Vous pouvez mêmeutiliser cela à l'intérieur d'une classe pour les propriétés et les acquéreurs d'appel.

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