PHP Conference Japan 2024

define

(PHP 4, PHP 5, PHP 7, PHP 8)

define定義一個命名常數

說明

define(字串 $constant_name, 混合 $value, 布林 $case_insensitive = false): 布林

在執行時期定義一個命名常數。

參數

constant_name

常數的名稱。

注意事項:

可以使用保留名稱,甚至無效名稱用 define() 定義常數,其值可以(僅)使用 constant() 擷取。但不建議這樣做。

value

常數的值。在 PHP 5 中,value 參數必須是一個 純量 值(整數浮點數字串布林值null)。在 PHP 7 中,也接受 陣列 值。

警告

雖然可以定義 資源 常數,但不建議這樣做,因為可能會導致不可預測的行為。

case_insensitive(大小寫不敏感)

如果設為 true,則常數將定義為大小寫不敏感。預設行為為大小寫敏感;也就是說,CONSTANTConstant 代表不同的值。

警告

自 PHP 7.3.0 起,不建議定義大小寫不敏感的常數。從 PHP 8.0.0 開始,只有 false 是可接受的值,傳遞 true 將會產生警告。

注意事項:

大小寫不敏感的常數會以小寫儲存。

回傳值

成功時回傳 true,失敗時回傳 false

更新日誌

版本 說明
8.0.0 true 傳遞給 case_insensitive 現在會發出 E_WARNING 警告。傳遞 false 仍然允許。
7.3.0 case_insensitive 已被棄用,並將在 8.0.0 版中移除。
7.0.0 允許 陣列 值。

範例

範例 #1 定義常數

<?php
define
("CONSTANT", "Hello world.");
echo
CONSTANT; // 輸出 "Hello world."
echo Constant; // 輸出 "Constant" 並發出一個通知。

define("GREETING", "Hello you.", true);
echo
GREETING; // 輸出 "Hello you."
echo Greeting; // 輸出 "Hello you."

// 從 PHP 7 開始有效
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo
ANIMALS[1]; // 輸出 "cat"

?>

範例 #2 使用保留名稱的常數

此範例說明了定義與 魔術常數 相同名稱的常數的*可能性*。由於產生的行為顯然令人困惑,因此在實務中不建議這樣做。

<?php
var_dump
(defined('__LINE__'));
var_dump(define('__LINE__', 'test'));
var_dump(constant('__LINE__'));
var_dump(__LINE__);
?>

以上範例會輸出:

bool(false)
bool(true)
string(4) "test"
int(5)

另請參閱:

新增註釋

使用者貢獻的註釋 11 則註釋

ravenswd at gmail dot com
9 年前
請注意,如果關閉了「通知」級別的錯誤報告,那麼嘗試將常數用作變數將導致它被解釋為字串,如果它尚未被定義。

我正在開發一個程式,其中包含一個設定檔,內容如下:

<?php
define
('ENABLE_UPLOADS', true);
?>

因為我想移除上傳功能,所以我將檔案改為:

<?php
//define('ENABLE_UPLOADS', true);
?>

然而,令我驚訝的是,程式仍然允許上傳。深入研究程式碼後,我發現了這個:

<?php
if ( ENABLE_UPLOADS ):
?>

由於 'ENABLE_UPLOADS' 沒有被定義為常數,PHP 將其使用解釋為字串常數,這當然會被評估為 True。
@SimoEast on Twitter
7 年前
我不確定為什麼文件中省略了這一點,但是當嘗試使用 define() 定義一個已經定義的常數時,它會失敗,觸發 E_NOTICE 錯誤,並且常數的值將保持其最初定義的值(新的值將被忽略)。

(我想這就是它們被稱為「常數」的原因。)
danbettles at yahoo dot co dot uk
15 年前
define() 會完全按照指定的定義常數。因此,如果您想在命名空間中定義常數,即使您是從命名空間內呼叫 define(),也需要在呼叫 define() 時指定命名空間。以下範例將使其更加清楚。

以下程式碼將在全域命名空間(即「\MESSAGE」)中定義常數「MESSAGE」。

<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>

以下程式碼將在「test」命名空間中定義兩個常數。

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
Dale Landry
7 年前
從 PHP 7 開始,現在可以定義陣列常數。

參考以下程式碼:
<?php

define
( "EXPLENATIVES", [1 => "Foo Bar", 2 => "Fehw Bahr", 3 => "Foo Bahr", 4 => "Fooh Bar", 5 => "Fooh Bhar", 6 => "Foo Barr", 7 => "Foogh Bar", 8 => "Fehw Barr", 9 => "Fu bar", 10 => "Foo Bahr", 11 => "Phoo Bar", 12 => "Foo Bawr", 13 => "Phooh Baughr", 14 => "Foogan Bargan", 15 => "Foo Bahre", 16 => "Fu Bahar", 17 => "Fugh Bar", 18 => "Phou Baughr"]);

//set up define methods using mixed values; both array and non-array values
define("NAVBTNS", [EXPLENATIVES, "Nouns", "Verbs", "Adjectives"]);

//function to create a dropdown menu using the EXPLENATIVES array $btn=EXPLENATIVES=assoc_array

function construct_navbar_buttons(){

$btns = '<ul class="nav navbar-nav">';

foreach(
NAVBTNS as $button => $btn){
if(
is_array($btn)){
$btns .= '<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="?id='
.$btn.'">
<i class="glyphicon glyphicon-user"></i> You Dare Say? <i class="glyphicon glyphicon-collapse-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">'
;
foreach(
EXPLENATIVES as $key => $button){
$btns .= '<li><a href="#">'.$button.'</a></li>';
}
$btns .= '</ul>';
}else{
$btns .= '<li><a href="#">'.$btn.'</a></li>';
}
}

$btns .= '</ul>';
return
$btns;
}

Love this new implementation!

?>
eparkerii at carolina dot rr dot com
16 年前
發現一些有趣的事情。以下的 define:

<?php
define
("THIS-IS-A-TEST","This is a test");
echo
THIS-IS-A-TEST;
?>

會回傳 '0'。

然而這個:

<?php
define
("THIS_IS_A_TEST","This is a test");
echo
THIS_IS_A_TEST;
?>

會回傳 'This is a test'。

這可能是眾所周知的事情,但我幾分鐘前才發現。

[danbrown AT php DOT net 編輯:原發文者指的是連字號與底線的差異。連字號不能用在 define 或變數中,這是預期的行為。]
chris at peeto dot net
14 年前
常數的值可以是另一個常數的值。

<?php

define
("NEW_GOOD_NAME_CONSTANT", "I have a value");
define("OLD_BAD_NAME_CONSTANT", NEW_GOOD_NAME_CONSTANT);

echo
NEW_GOOD_NAME_CONSTANT; // 目前的
echo OLD_BAD_NAME_CONSTANT; // 舊的

?>
Jamie
13 年前
這很明顯,但很容易忘記:如果你引入一個檔案,被引入的檔案只能使用已經定義的常數。例如:

<?php
define
("VEG","cabbage");
require(
"another file");
define("FRUIT","apple");

// "another file" 的內容:
echo VEG; // cabbage
echo FRUIT; // FRUIT
?>
swisschocolate at cmail dot nu
8 年前
我想值得一提的是,define() 似乎會忽略無效的常數名稱。
這樣做會有一個立即的影響:如果你使用無效的常數名稱,你必須使用 constant() 來存取它,而且顯然你無法使用 define() 的回傳值來判斷所使用的常數名稱是否無效。

例如:
$name = '7(/!§%';
var_dump(define($name, "hello")); // 輸出 bool(true)
var_dump(constant($name)); // 輸出 string(5) "hello"
axew3 at axew3 dot com
8 年前
PHP 7 - Define:「在執行時期定義一個具名常數。在 PHP 7 中,也接受陣列值。」

但在 PHP 7 之前的版本,你可以這樣做,使用 define 將陣列傳遞到其他地方:

$to_define_array = serialize($array);
define( "DEFINEANARRAY", $to_define_array );

... 然後 ...

$serialized = DEFINEANARRAY; // 直接傳遞定義的值將無法運作
$our_array = unserialize($serialized);

print_r($our_array);
匿名
7 年前
將第三個參數設定為 true(大小寫不敏感的常數)有一個未記錄的副作用:這些常數實際上可以被重新定義為大小寫敏感的,除非它是全小寫(無論如何都不應該這樣定義)。

事實是,大小寫敏感的常數會按原樣儲存,而大小寫不敏感的常數會以小寫形式儲存在內部。你仍然可以定義名稱相同但大小寫不同的其他常數(全小寫除外)。

<?php
// 「echo CONST」會印出 1,與「echo const」、「echo CoNst」等相同。
define('CONST', 1, true);
echo CONST;
// 印出 1

define('CONST', 2);
echo CONST;
// 印出 2
echo CoNsT; // 印出 1
echo const; // 印出 1

// ** PHP 通知:常數 const 已經定義 **
define('const', 3);
echo const;
// 印出 1
echo CONST; // 印出 2
?>

為什麼要這樣用?

第三方外掛程式可能會嘗試定義一個你已經設定值的常數。如果允許它們設定新值,假設你無法編輯外掛程式,你可以將你的常數定義為大小寫不敏感。如果需要,你仍然可以使用外掛程式以外的任何大小寫方式來存取原始值。事實上,我想不出其他情況下你會想要一個大小寫不敏感的常數...
me at mariusgerum dot de
6 年前
你可以使用變數名稱來定義常數(也適用於常數值、變數、陣列值或類別屬性等等——只要它是有效的常數名稱)。

<?php

# 定義一個常數,並將有效的常數名稱設定為字串值
define("SOME_CONSTANT", "NEW_CONSTANT");

# 使用動態名稱(SOME_CONSTANT 的值)定義第二個常數
define(SOME_CONSTANT, "Some value");

# 輸出
echo SOME_CONSTANT; // 顯示 "NEW_CONSTANT"
echo "<br>";
echo
NEW_CONSTANT; // 顯示 "Some value"

?>

不用說,在這種情況下,您將完全失去 IDE 對重構和醒目提示的支援。
不知道為什麼有人會/可以使用這個,但我認為值得一提。
To Top