web-dev-qa-db-fra.com

Puis-je utiliser la concaténation de chaînes pour définir une classe CONST en PHP?

Je sais que vous pouvez créer des constantes globales les unes par rapport aux autres en utilisant la concaténation de chaînes:

define('FOO', 'foo');
define('BAR', FOO.'bar');  
echo BAR;

imprimera "foobar".

Cependant, j'obtiens une erreur en essayant de faire de même en utilisant des constantes de classe.

class foobar {
  const foo = 'foo';
  const foo2 = self::foo;
  const bar = self::foo.'bar';
}

foo2 est défini sans problème, mais la déclaration de la barre de const entraînera une erreur

Erreur d'analyse: erreur de syntaxe, '.' Inattendu, attente ',' ou ';'

J'ai également essayé d'utiliser des fonctions comme sprintf () mais il n'aime pas plus le paren gauche que le concaténateur de chaînes '.'.

Existe-t-il un moyen de créer des constantes de classe les unes par rapport aux autres dans autre chose qu'un casse trivial comme foo2?

48
selfsimilar

À mon humble avis, cette question mérite une réponse pour PHP 5.6 + , grâce à @jammin commentaire

Depuis PHP 5.6 vous êtes autorisé à définir une expression scalaire statique pour une constante:

class Foo { 
  const BAR = "baz";
  const HAZ = self::BAR . " boo\n"; 
}

Bien que cela ne fasse pas partie de la question, il faut être conscient des limites de la mise en œuvre. Ce qui suit ne fonctionnera pas, bien qu'il s'agisse d'un contenu statique (mais peut être manipulé lors de l'exécution):

class Foo { 
  public static $bar = "baz";
  const HAZ = self::$bar . " boo\n"; 
}
// PHP Parse error:  syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS)

class Foo { 
  public static function bar () { return "baz";}
  const HAZ = self::bar() . " boo\n"; 
}
// PHP Parse error:  syntax error, unexpected '(', expecting ',' or ';'

Pour plus d'informations, consultez: https://wiki.php.net/rfc/const_scalar_exprs et http://php.net/manual/en/language.oop5.constants .php

22
Trendfischer

La seule façon est de définir () une expression puis d'utiliser cette constante dans la classe

define('foobar', 'foo' . 'bar');

class Foo
{
    const blah = foobar;
}

echo Foo::blah;

Une autre option est d'aller sur bugs.php.net et de bien vouloir leur demander de résoudre ce problème.

34
user187291

Revenez toujours au manuel de confiance pour des trucs comme ça.

Concernant constantes :

La valeur doit être une expression constante et non (par exemple) une variable, une propriété, le résultat d'une opération mathématique ou un appel de fonction.

Alors ... "non" serait la réponse: D

14
Peter Bailey

Pour les constantes de classe , vous ne pouvez pas assigner autre chose qu'une expression constante. Citant le manuel PHP :

"La valeur doit être une expression constante, pas (par exemple) une variable, une propriété, le résultat d'une opération mathématique ou un appel de fonction."

2
Dumb Guy

Ce n'est peut-être pas directement ce que vous recherchez, mais je suis tombé sur ce fil, alors voici une solution que j'ai utilisée pour un problème que j'avais (basé sur la réponse de @ user187291):

define('app_path', __DIR__ . '/../../');
const APPLICATION_PATH = app_path;
.
.
.
require_once(APPLICATION_PATH . "some_directory/some_file.php");
.
.
.

Semble fonctionner très bien!

1
MuffinTheMan

non.

(Je ne pense pas qu'il y en ait)

0
Bingy