2011-06-23 14 views
36

PHPで定数を定義解除または変更できますか?PHPで定数を定義解除または変更できますか?

+41

つまり、定数を変数にしたいですか?これについてもう少し考えてみたいかもしれません。 –

+4

@MarcBしかしOPのユーザー名が与えられれば適切です。 – abligh

+0

@MarcB OPは明らかに質問の皮肉を認めていました(この質問を投稿するだけのアカウントを作った)が、真剣にそれを提起しています。 PHPの作成者が「定数」と呼ぶことを決めたものの1つを定義解除できますか?_ –

答えて

45

定数は、constantです。

参考:一度定数が定義されているphp.net/manual/language.constants.php

+0

それでPHPはこれを達成するためにグローバル変数の使用を奨励しますか? – TheConstantGardener

+4

@TheConstantGardener:必ずしもそうではありません。良い設計にはグローバル変数が必要な場合はほとんどありません。 –

+2

なぜWordpressは851回の66ファイルでグローバルキーワードを使用しますか? – TheConstantGardener

10

号、それは変わっていないか、未定義とすることはできません。

+1

これは間違っています。ランキング拡張(別の答えで言及されているように)は、PHP 4以降でそれを可能にしました。最近、uopz拡張もPHP 5.4からの拡張を可能にします。 –

14

これは絶対に実行する必要がある場合(私は他人が述べているように推奨しませんが)、あなたは常にRunkitを使用できます。

http://www.php.net/manual/en/function.runkit-constant-redefine.php

http://www.php.net/manual/en/function.runkit-constant-remove.php

+22

このようなナンセンスは、そこにひどいPHPコードがある理由の1つです。このような方法で言語構造を破壊することはひどい考えであり、それを行う開発者にはあまり反映されません。 –

+2

Runkitは、任意のWebホストにインストールされたことがない、オプションのPHP拡張モジュールです。 – gnud

+10

@George Cummins私はそこに同意します!それでも、OPは彼らが何をしているのか、何故定数を設定解除/再定義したがっているのか、何か非常に実験的な言語ハッキングのもののためにRunkitのようなものがあるかもしれないので、私はそれを投稿すると思った。 –

4

他のポスターは正しいです - あなたはこれを行うことはできません。しかし、おそらくあなたは、あなたの定義を、定数の最良の値が何であるかを知るところに移動することができます。

define('STRING1','Foo'); 
define('STRING2', 'Bar'); 
define('STRING3', 'Baz'); 

、あなたが条件を発見したら、STRING2の値を変更したい:

はおそらく、あなたは大きなリストに定数を定義しています。 1つの方法は、正しい設定がわかるまで定義を延期することです。

define('STRING1','Foo'); 
// define('STRING2', 'Bar'); -- wait until initialization 
define('STRING3', 'Baz'); 

... 


if (condition) { 
    define('STRING2', 'Bar type 2'); 
} else { 
    define('STRING2', 'Bar type 1'); 
} 

論理設定STRING2は、処理中に後で別のファイルに格納することもできます。

18

私はこれがゲームに遅れている...しかし、ここにいくつかの人々を助けるかもしれない一つのことは知っている...私はすべての私の定数を定義し、中に含まれ、私の「Application.php」ファイル(で

すべての私のスクリプト)私はこのような何かを:有効ので、通常

if(!defined("LOGGER_ENABLED")){ 
define("LOGGER_ENABLED", true); 
} 

は、すべてのスクリプトは、ログを取得するために起こっている...しかし、ある特定のスクリプトで、私はこの振る舞いをしたくない場合は、私は単純に前にこれを行うことができます私は私のApplication.phpを含んでいます:

define("LOGGER_ENABLED", false); 
+0

あなたのアプリケーション全体を見ることなく、これは不公平な仮定かもしれませんが、あなた自身のシステムを「上書き」するのはちょっとハッキリです。より具体的または論理的なものに基づいてLoggerを有効にするかどうかを管理しやすくするために、アプリケーション/フレームワークを再設計できませんか?それは、使用や管理が非常に面倒なように聞こえますが、上には聞こえないものがまれにしか使用されません。これは潜在的に有益な情報を潜在的に追加する正当な答えです。しかし、潜在的に悪い習慣を促進します。 – James

+0

@パトリック、はい、誰かが既に設定されている値を変更したいのであれば、それについてはNils Luxtonの答えが最適です。あなたは私を覚えていますか? –

+2

これは動作する解決策を提供するので、これを受け入れる必要があります。例えば、通常の練習でもあります。 Cコードなので、PHPで使用するには問題はありません – Sinisa

4

他の箇所で言及していないので、uopz拡張モジュールでは、PHP 5.4以降でuopz_undefine()を使用して定数を削除できます。

+1

投票者:私が書いたものが間違っている場合は、正しく言ってください。 –

関連する問題