web-dev-qa-db-fra.com

Redéfinir les constantes dans PHP

Est-il possible de redéfinir une constante en php qui a été définie par la fonction define? J'ai une classe avec plusieurs constantes qui contient les données utilisateur. J'essaie d'utiliser la classe pour plus d'un utilisateur.

define('ALLEGRO_ID', 'id');
define('ALLEGRO_LOGIN', 'login');
define('ALLEGRO_PASSWORD', 'passwd');
define('ALLEGRO_KEY', 'key');
define('ALLEGRO_COUNTRY', 123);

$allegro = new AllegroWebAPI( );                
$allegro -> Login();

Je n'ai pas écrit cette classe, mais je l'utilise en raison de contraintes de temps. Je ne sais pas pourquoi le créateur de cette classe defined les données utilisateur plutôt que d'utiliser les variables dans l'instance.

Je sais que les constantes doivent être constantes (évidemment!), Mais je cherche une astuce pour les redéfinir.

35
abuduba

Si vous avez installé extension runkit , vous pouvez utiliser runkit_constant_redefine() :

runkit_constant_redefine("name", "value");

Dans la plupart des cas, cependant, il serait préférable de réévaluer pourquoi vous utilisez des constantes et non quelque chose de plus approprié.

58
Tim Cooper

Non, vous ne pouvez pas redéfinir une constante (sauf avec runkit_constant_redefine ),
c'est pourquoi on l'appelle CONSTANT.

Ce que vous recherchez dans la classe est en fait une variable objet au format tableau: -

class user
{
  public $user = array();

  function load($user_id)
  {
    // etc
    $this->$user[$user_id] = something_else;
  }
}
23
ajreal

Dans PHP 5.6+, vous pouvez importer des constantes, sous un alias. Un tel alias peut écraser une constante déjà existante.

L'extrait suivant imprimera int(5):

define('ALLEGRO_ID', 3);
define('NEW_ALLEGRO_ID', 5);
use const NEW_ALLEGRO_ID as ALLEGRO_ID;
var_dump(ALLEGRO_ID);

Un tel mécanisme pourrait être légitime dans le test unitaire ou dans d'autres domaines où le comportement magique est toléré, mais n'est pas pratique pour votre cas d'utilisation, où une classe pour stocker vos paramètres utilisateur serait plus utile.

Enfin, ce comportement permet de créer des situations très déroutantes comme use const true as false;.

8
Dereckson

La valeur des constantes une fois définie reste inchangée tout au long du programme. Si vous avez une telle exigence où vous souhaitez modifier les valeurs à l'avenir, conservez ces valeurs dans les variables PHP.

5
atif