2012-01-24 3 views
0

Je suis en train d'écrire un système de template trivial pour exécuter des requêtes dynamiques sur un serveur.str_replace comportement inattendu

J'avais initialement le code suivant dans ma classe templating

$output = file_get_contents($this->file); 

foreach ($this->values as $key => $value) { 
    $tagToReplace = "{$key}"; 
    $output = str_replace($tagToReplace, $value, $output); 
} 

Je remarque que les cordes ne sont pas remplacés comme je m'y attendais (les caractères « {} » étaient encore présents dans la sortie).

J'ai alors changé la ligne 'offensant' à:

$tagToReplace = '{'."$key".'}'; 

Il a ensuite travaillé comme prévu. Pourquoi ce changement était-il nécessaire? Est-ce que "{" dans une chaîne interprétée a une signification particulière en PHP?

Répondre

6

Oui. Lorsque vous utilisez des guillemets, "{$key}" et "$key" sont identiques. Il est généralement fait pour que vous puissiez développer des variables plus complexes, telles que .

Vous pouvez utiliser des guillemets simples (comme vous avez), échapper les accolades - "\{$key\}" - ou envelopper la variable deux fois: "{{$key}}".

En savoir plus ici: http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

1

Oui. Cela aide à résoudre les noms de variables. Jetez un oeil à this question.

{ et } peut être utilisé comme suit:

$test = "something {$foo->awesome} value."; 

Par ailleurs, vous pouvez améliorer votre code en utilisant les éléments suivants (et donc d'éviter la situation que vous rencontrez en ce moment):

$output = file_get_contents($this->file); 
$output = str_replace(array_keys($this->values), $this->values, $output); 
+0

vous avez oublié une fonction anonyme pour envelopper les touches dans {}! – meze