2010-11-18 10 views
36

Qualcuno ha realizzato un'implementazione StringBuilder in PHP?StringBuilder per PHP

+3

Perché vuoi qualcosa di simile? – Webnet

+4

correlati: [php String Concatenation, Performance] (http://stackoverflow.com/q/124067/106224) (molte delle risposte non soddisfano la necessità di una tale classe, ma tutte con buone ragioni) – BoltClock

+1

Non si Ho bisogno di StringBuilder in PHP, vedi la mia risposta: http://stackoverflow.com/questions/124067/php-string-concatenation-performance/16112845#16112845 – nightcoder

risposta

85

Nota:

Questa risposta è a partire dal 2010, ci potrebbe essere stringbuilders che possono migliorare le prestazioni ormai (a giudicare dai commenti qui sotto). Non ho lavorato con PHP per molto tempo quindi la mia conoscenza non è aggiornata. Questa risposta potrebbe essere obsoleta.


Perché si desidera utilizzare un oggetto StringBuilder? Le stringhe in php sono mutabili. Pertanto le prestazioni non sono un problema.

solo costruire stringa come questa

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

Vorrei +1, ma l'operatore di concatenazione è '. =', non '+ =' ('+ =' è usato per Inoltre, che è un operatore diverso dalla concatenazione) ... – ircmaxell

+2

oops, Grazie per averlo indicato.Per molto usato per java: P. Risolto adesso –

+0

sì l'ho notato anch'io, dal linguaggio C :) – RobertPitt

6

È possibile utilizzare sprintf che è solo una versione di base, ma non richiede librerie extra, esempi Seguire

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

e maniglie anche casting di tipo e posizione sostituzioni:

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

Tutti se mi piace l'aspetto della risposta di jacob :)

dare un'occhiata alla grande funzionalità di t sua funzione e sua sorella funct ione qui: http://php.net/manual/en/function.sprintf.php

+0

Non ho mai capito l'utilità di questa funzione in quel tipo di metodo .. – Webnet

+4

@Webnet Beh, va bene per le stringhe definite altrove (ad esempio in un file di traduzione). Altrimenti diventa nient'altro che una stringa magica (che è lo stesso concetto di [Numero magico] (http://en.wikipedia.org/wiki/Magic_number)) – ircmaxell

+0

L18n è esattamente l'uso migliore per questa funzione e anche funzione sorella per le conversioni char: 'printf (" char 65 =% c ", 65);' – RobertPitt

4

Ci sono alcune implementazioni là fuori, ma non vedo il motivo per cui si avrebbe bisogno di uno StringBuilder in PHP, almeno non per motivi di prestazioni. La semplice concatenazione di stringhe in PHP è più veloce di sprintf o dell'impostazione suggerita da Jacob.

2

Non è necessario StringBuilder o StringBuffer in PHP, PHP è super a portata di mano che vi offro, utilizzando da heredoc e NowDoc se si desidera mantenere 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

in base alla risposta, ho suggerito di utilizzare variabili e campi di classe direttamente all'interno del blocco HERE_DOC/NOW_DOC. –

1

Risposta del @Amir, mi ha dato ispirazione per il fatto che in PHP se vuoi parametri 'named parameters' o 'posizionitional', non hai bisogno di sprintf, ma HERE_DOC/NOW_DOC funziona perfettamente. È possibile ancheutilizzare questo all'interno di una classe per proprietà e getter di chiamata.

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