2010-11-18 11 views
36

¿Alguien ha realizado una implementación de StringBuilder en PHP?StringBuilder para PHP

+3

¿Por qué quieres algo como esto? – Webnet

+4

Relacionado: [php String Concatenation, Performance] (http://stackoverflow.com/q/124067/106224) (muchas de las respuestas descartan la necesidad de dicha clase, pero todas con buenas razones) – BoltClock

+1

No lo hace Necesito StringBuilder en PHP, mira mi respuesta: http://stackoverflow.com/questions/124067/php-string-concatenation-performance/16112845#16112845 – nightcoder

Respuesta

85

Nota:

Esta respuesta es a partir de 2010, puede haber stringbuilders que pueden mejorar el rendimiento a estas alturas (a juzgar por los comentarios a continuación). No he trabajado con php durante mucho tiempo, por lo que mi conocimiento no está actualizado. Esta respuesta puede estar desactualizada.


¿Por qué quieres usar un StringBuilder? Las cadenas en php son mutables. Por lo tanto, el rendimiento no es un problema.

Sólo construir cadena como esta

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

Yo haría +1, pero el operador de concatenación es '. =', no '+ =' ('+ =' se usa para Además, que es un operador diferente de la concatenación) ... – ircmaxell

+2

Vaya, gracias por señalar eso.Muy acostumbrado a java: P. Solucionado ahora –

+0

sí lo noté también, del lenguaje C :) – RobertPitt

6

Puede utilizar sprintf que es sólo una versión básica, pero no requiere librerías adicionales, ejemplos siguen

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

Y también se encarga de la conversión de tipos y posición reemplazos:

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

Todos sin embargo me gusta el aspecto de la respuesta de jacob :)

tomador un vistazo a la gran funcionalidad de t su función y su función hermana ion aquí: http://php.net/manual/en/function.sprintf.php

+0

Nunca he entendido la utilidad de esta función en ese tipo de método. . – Webnet

+4

@Webnet Bueno, es bueno para las cadenas que se definen en otra parte (como en un archivo de traducción). De lo contrario, se convierte en nada más que una cadena mágica (que es el mismo concepto que un [Magic Number] (http://en.wikipedia.org/wiki/Magic_number)) – ircmaxell

+0

L18n es exactamente el mejor uso para esta función y también su función hermana para conversiones char: 'printf (" char 65 =% c ", 65);' – RobertPitt

4

Hay algunas implementaciones por ahí, sin embargo, no veo por qué se necesita un StringBuilder en PHP, por lo menos no por razones de rendimiento. La concatenación simple de cadenas en PHP es más rápida que sprintf o la impelementación sugerida por Jacob.

2

No es necesario StringBuilder o StringBuffer en PHP, PHP es súper práctico que te ofrezco, usando de heredoc y nowdoc si desea mantener 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 función de su respuesta, hice una sugerencia de usar variables y campos de clase directamente dentro del bloque HERE_DOC/NOW_DOC. –

1

respuesta de @Amir, me dio Inspiración al hecho de que en PHP si desea parámetros 'parámetros nombrados' o 'posicionales', no necesita sprintf, pero HERE_DOC/NOW_DOC funciona perfecto. Puede inclusoutilizar esto dentro de una clase para las propiedades y los captadores de llamadas.

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