3

大文字と小文字を区別しないパラメーターで定数をオーバーライドしています。しかし、php では「定数が既に定義されています」というエラーは表示されません。E_ALL、E_STRICT エラーを有効にしました。例:1

define('ONE',1000);
define('one',2000,true);
echo ONE; // prints 1000
echo one; // prints 2000

2 行目では、大文字と小文字を区別しない別の定数として「one」を作成しています。これは、「ONE」を再定義することを意味します。しかし、PHP はエラーや警告を出しません。

例:2

define('ONE',1000,true);
define('one',2000);
echo ONE; // prints 1000 with constant already defined notice
echo one; // prints 1000

ここでエラー通知を取得できます。

これら 2 つのコード ブロックの違いは何ですか?

4

2 に答える 2

6

ドキュメントから:

注: 大文字と小文字を区別しない定数は、小文字で格納されます。

したがって、2番目の例で定数の小文字バージョンを定義しようとすると、同じ名前の定数の以前の大文字と小文字を区別しない定義により、定数は既に定義されています。

define('ONE', 1000, true);  // defines strtolower("ONE") = "one"
define('one', 2000);        // error redefining "one"

最初のシナリオでは、そのような衝突はありません:

define('ONE', 1000);        // defines "ONE"
define('one', 2000, true);  // defines strtolower("one") = "one"
于 2013-02-26T17:34:53.093 に答える
0

define 関数の 3 番目のパラメーターは、case_insensitive オプションです。 http://php.net/manual/de/function.define.php

最初の例では、定数 ONE が定義されています。そして、case_insensitive true の定数です。ONEを介して到達できる変数と、oNe、One、oNEなどを介して到達できる変数を取得したことを意味します.

2 番目の例では、最初に case_insensitive true で定数 ONE を定義し、次に定数 ONE を定義します。しかし、今回はすべての可能な名前 (OnE、oNe、one) が既に与えられているので、インタープリターはエラー通知を出します。

于 2013-02-26T17:38:22.793 に答える