184 votes

Accolades dans une chaîne de caractères en PHP

Quelle est la signification de { } (accolades) dans la sortie d'une chaîne de caractères en PHP ?

270voto

cletus Points 276888

Ils sont utilisés pour échapper aux expressions de variables. À partir de Cordes :

Syntaxe complexe (curly)

On ne dit pas que c'est complexe parce que la syntaxe est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.

En fait, toute valeur de l'espace de nom peut être incluse dans un chaîne de caractères avec cette syntaxe. Il suffit d'écrire l'expression l'expression de la même manière qu'elle apparaîtrait apparaîtrait en dehors du chaîne de caractères et puis l'envelopper dans { et }. Puisque { ne peut ne peut pas être échappé, cette syntaxe ne sera sera reconnue que si le $ suit immédiatement immédiatement après le {. Utilisez {\$ pour obtenir un littéral {$. Quelques exemples pour que ce soit claires :

<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// Works
echo "This square is {$square->width}00 centimeters broad."; 

// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong  outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}"; 

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
?>

Je dis "échapper" parce que vous pouvez le faire :

$a = 'abcd';
$out = "$a $a"; // "abcd abcd";

o

$out = "{$a} {$a}"; // same

donc dans ce cas les accolades sont inutiles mais :

$out = "$aefgh";

selon votre niveau d'erreur, ne fonctionnera pas ou produira une erreur car il n'y a pas de variable nommée $aefgh donc vous devez faire :

$out = "${a}efgh"; // or
$out = "{$a}efgh";

46voto

Kredo900 Points 171

Pour ma part, les accolades servent de substitution à la concaténation, elles sont plus rapide à taper et le code est plus propre. N'oubliez pas d'utiliser des guillemets doubles (" ") car leur contenu est analysé par PHP, parce qu'entre guillemets simples (' '), vous obtiendrez le code nom littéral de la variable fournie :

<?php

 $a = '12345';

// This works:
 echo "qwe{$a}rty"; // qwe12345rty, using braces
 echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used

// Does not work:
 echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
 echo "qwe$arty"; // qwe, because $a became $arty, which is undefined

?>

16voto

Obiware Points 31

Rapidement...

Cet échantillon est pour un livre :

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

Sans les accolades, PHP essaie de trouver une variable nommée $numberth, qui n'existe pas !

4voto

Ray N. Franklin Points 505

J'ai également trouvé utile d'accéder à des attributs d'objets dont les noms d'attributs varient selon un itérateur. Par exemple, j'ai utilisé le modèle ci-dessous pour un ensemble de périodes de temps : heure, jour, mois.

$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
    $this->{'value_'.$period}=1;
}

Ce même modèle peut également être utilisé pour accéder aux méthodes des classes. Il suffit de construire le nom de la méthode de la même manière, en utilisant des chaînes et des variables de type chaîne.

Vous pourriez facilement argumenter en utilisant simplement un tableau pour le stockage des valeurs par période. Si cette application était uniquement en PHP, je serais d'accord. J'utilise ce modèle lorsque les attributs de classe correspondent aux champs d'une table de base de données. Bien qu'il soit possible de stocker des tableaux dans une base de données en utilisant la sérialisation, c'est inefficace et inutile si les champs individuels doivent être indexés. J'ajoute souvent un tableau de noms de champs, avec la clé de l'itérateur, pour obtenir le meilleur des deux mondes.

class timevalues
{
                             // Database table values:
    public $value_hour;      // maps to values.value_hour
    public $value_day;       // maps to values.value_day
    public $value_month;     // maps to values.value_month
    public $values=array();

    public function __construct()
    {
        $this->value_hour=0;
        $this->value_day=0;
        $this->value_month=0;
        $this->values=array(
            'hour'=>$this->value_hour,
            'day'=>$this->value_day,
            'month'=>$this->value_month,
        );
    }
}

-5voto

user1232972 Points 243

Voici le code que j'ai obtenu d'un plugin wordpress

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

Il s'agit d'une technique très pratique pour formater des chaînes de caractères complexes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X