Inclure la constante dans la chaîne sans concaténer

Existe-t-il un moyen en PHP d'inclure une constante dans une chaîne sans concaténer?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";
138
demandé sur silkfire 2010-02-05 02:13:04

12 réponses

Non.

Avec les chaînes, il n'y a aucun moyen pour PHP de distinguer les données de chaîne des identificateurs constants. Cela vaut pour l'un des formats de chaîne en PHP, y compris heredoc.

constant() est une autre façon d'obtenir une constante, mais un appel de fonction ne peut pas être mis dans une chaîne sans concaténation soit.

Manuel sur les constantes PHP

124
répondu Pekka 웃 2017-03-29 09:06:57

Oui, c'est (en quelque sorte ;) ):

define('FOO', 'bar');

$test_string = sprintf('This is a %s test string', FOO);

Ce n'est probablement pas ce que vous cherchiez, mais je pense que techniquement ce n'est pas une concaténation mais une substitution et à partir de cette hypothèse, il inclut une constante dans une chaîne sans concaténer.

91
répondu Felix Kling 2010-02-04 23:23:54

Pour utiliser des constantes dans les chaînes, vous pouvez utiliser la méthode suivante:

define( 'ANIMAL', 'turtles' ); 
$constant = 'constant';

echo "I like {$constant('ANIMAL')}";


Comment ça marche?

Vous pouvez utiliser n'importe quel nom de fonction de chaîne et des paramètres arbitraires

On peut placer n'importe quel nom de fonction dans une variable et l'appeler avec des paramètres dans une chaîne entre guillemets doubles. Fonctionne avec plusieurs paramètres aussi.

$fn = 'substr';

echo "I like {$fn('turtles!', 0, -1)}";

Produit

J'aime les tortues

Fonctions anonymes aussi

Vous pouvez également utiliser anonymous fonctions à condition que vous utilisez PHP 5.3+.

$escape   = function ( $string ) {
    return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );

Produit correctement HTML échappé comme prévu.

Tableaux de rappel non autorisés!

Si vous avez maintenant l'impression que le nom de la fonction peut être appelé, ce n'est pas le cas, car un tableau qui renvoie true lorsqu'il est passé à is_callable provoquerait une erreur fatale lorsqu'il est utilisé dans une chaîne:

class Arr
{

    public static function get( $array, $key, $default = null )
    {
        return is_array( $array ) && array_key_exists( $key, $array ) 
            ? $array[$key] 
            : $default;
    }
}

$fn = array( 'Arr', 'get' );
var_dump( is_callable( $fn ) ); // outputs TRUE

// following line throws Fatal error "Function name must be a string"
echo( "asd {$fn( array( 1 ), 0 )}" ); 

Gardez à l'esprit

Cette pratique est mal conseillée, mais entraîne parfois un code beaucoup plus lisible, donc c'est a vous de la possibilité est là.

48
répondu raveren 2014-03-14 15:08:28
define( 'FOO', 'bar');  
$FOO = FOO;  
$string = "I am too lazy to concatenate $FOO in my string";
17
répondu Macswork 2011-03-01 18:12:12
define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";
13
répondu thetaiko 2010-02-08 14:56:09

Si vous voulez vraiment faire écho à une constante sans concaténation Voici la solution:

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';

Note: dans cet exemple echo prend un certain nombre de paramètres (regardez les virgules), donc il n'est pas vraiment de la concaténation

Echo se comporte comme une fonction, il prend plus de paramètres, il est plus efficace que la concaténation, car il n'a pas à concaténer et ensuite echo, il fait juste écho à tout sans avoir besoin de créer un nouvel objet concaténé par chaîne :))

Modifier

Aussi, si vous considérez concaténer chaînes, passer des chaînes comme Paramètres ou écrire chaînes entières avec " , Le , (version virgule) est toujours le plus rapide, suivant va . (concaténation avec ' guillemets simples) et la méthode de construction de chaîne la plus lente utilise des guillemets doubles ", parce que les expressions écrites de cette façon doivent être évaluées par rapport aux variables et aux fonctions déclarées..

11
répondu Juraj Blahunka 2010-02-04 23:32:59

Vous pourriez faire:

define( 'FOO', 'bar' );

$constants = get_defined_constants(true); // the true argument categorizes the constants
$constants = $constants[ 'user' ]; // this gets only user-defined constants

echo "Hello, my name is {$constants['FOO']}";
11
répondu Simon 2016-10-24 20:54:16

Comme d'autres l'ont souligné, vous ne pouvez pas le faire. PHP a une fonction constant() qui ne peut pas être appelée directement dans une chaîne mais nous pouvons facilement contourner cela.

$constant = function($cons){
   return constant($cons);
};

Et un exemple de base sur son utilisation:

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}"; 
5
répondu Yamiko 2012-08-13 17:46:27

Voici quelques alternatives aux autres réponses, qui semblent se concentrer principalement sur l'astuce" { $ }". Bien qu'aucune garantie ne soit faite sur leur vitesse; c'est tout le sucre syntaxique pur. Pour ces exemples, nous supposerons que l'ensemble des constantes ci-dessous ont été définis.

define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );

Utilisation de l'extrait()
Celui-ci est agréable car le résultat est identique aux variables. Vous créez d'abord une fonction réutilisable:

function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }

Alors appelez-le de n'importe quelle portée:

extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";

Ici, c'est en minuscules les constantes sont plus faciles sur vos doigts, mais vous pouvez supprimer array_change_key_case () pour les garder telles quelles. Si vous avez déjà des noms de variables locales en conflit, les constantes ne les remplaceront pas.

Utilisation du remplacement de chaîne
Celui-ci est similaire à sprintf(), mais utilise un seul jeton de remplacement et accepte un nombre illimité d'arguments. Je suis sûr qu'il y a de meilleures façons de le faire, mais pardonnez ma maladresse et essayez de vous concentrer sur l'idée derrière cela.

Comme avant, vous créez une fonction réutilisable:

function fill(){
    $arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr );
    while( strpos( $s, '/' ) !== false ){
        $s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr );
    } return $s;
}

Alors appelez-le de n'importe quelle portée:

$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );

Vous pouvez utiliser n'importe quel jeton de remplacement que vous voulez, comme un % ou #. J'ai utilisé la barre oblique ici car c'est un peu plus facile à taper.

1
répondu Beejor 2016-05-14 14:24:26

Le moyen le plus simple est

define('MY_CONSTANT', 42);

$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";

Une autre façon d'utiliser (s)printf

define('MY_CONSTANT', 42);

// Note that %d is for numeric values. Use %s when constant is a string    
printf('This is my constant: %d', MY_CONSTANT);

// Or if you want to use the string.

$my_string = sprintf('This is my constant: %d', MY_CONSTANT);
echo $my_string;
1
répondu Jekis 2017-05-02 08:35:35

Il est amusant que vous puissiez utiliser le mot-clé 'const' comme nom pour votre fonction pour éviter les déchets d'espace de noms:

define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST

Vous pouvez également utiliser $ GLOBALS pour propager la fonction 'const' dans tout le code:

$GLOBALS['const'] = function($a){return $a;};

Incertain est-il sûr pour l'utilisation future. Et ce qui est pire-il est toujours laid.

0
répondu user619271 2013-07-30 12:16:28

Je crois que cela répond à la question initiale du PO. La seule chose est que la clé d'index globals semble fonctionner uniquement en minuscules.

define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";

Sortie:

DB_USER=root
-2
répondu FattyPotatoes 2013-06-07 04:36:36