web-dev-qa-db-ja.com

PHPでの定数の再定義

define関数で定義されたphpの定数を再定義することは可能ですか?ユーザーデータを含むいくつかの定数を持つクラスがあります。クラスを複数のユーザーに使用しようとしています。

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();

このクラスは作成しませんでしたが、時間の制約のために使用しています。インスタンスで変数を使用するのではなく、このクラスの作成者がユーザーデータをdefinedする理由はわかりません。

定数は定数であるべきだということは明らかです(もちろんです!)が、それらを再定義するためのトリックを探しています。

35
abuduba

runkit extension がインストールされている場合、 runkit_constant_redefine() を使用できます。

runkit_constant_redefine("name", "value");

ただし、ほとんどの場合、より適切なものではなく、定数を使用している理由を再評価することをお勧めします。

58
Tim Cooper

いいえ、定数を再定義することはできません( runkit_constant_redefine を使用する場合を除く)、
だからCONSTANTと呼ばれています。

クラスで探しているのは、実際には配列形式のオブジェクト変数です。

class user
{
  public $user = array();

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

PHP 5.6+では、エイリアスの下で定数をインポートできます。このようなエイリアスは既存の定数を上書きできます。

次のスニペットはint(5)を出力します:

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

このようなメカニズムは、単体テストや、魔法の動作が許容されるその他の分野では正当である可能性がありますが、ユーザー設定を保存するクラスがより有用であるユースケースには不便です。

最後に、この動作により、use const true as false;

8
Dereckson

一度定義された定数値は、プログラム全体で変更されません。将来的に値を変更する必要がある場合は、そのような値をPHP変数に保持します。

5
atif