語法
define(string $name, mixed $value, bool $case_insensitive = false): bool
- `$name`:常數名稱,慣例全大寫(如 `APP_VERSION`)。
- `$value`:常數值,僅限純量或陣列(PHP 7+ 支援陣列)。
- `$case_insensitive`:
true 為大小寫不敏感(不建議,預設 false)。
基本範例
<?php
define('PI', 3.1415926);
define('APP_NAME', 'MyApp', true); // 大小寫不敏感
echo PI; // 3.1415926
echo app_name; // MyApp(不區分大小寫)
echo APP_NAME; // MyApp
// 常數不可變更,重複定義會發出 Notice 並忽略
define('PI', 3.0); // Notice: Constant PI already defined
?>
預先定義的魔術常數
| 常數 | 說明 |
| __LINE__ | 目前行號 |
| __FILE__ | 完整檔案路徑(含檔名) |
| __DIR__ | 檔案所在目錄(PHP 5.3+) |
| __FUNCTION__ | 函數名稱 |
| __CLASS__ | 類別名稱 |
| __TRAIT__ | Trait 名稱 |
| __METHOD__ | 方法名稱 |
| __NAMESPACE__ | 命名空間名稱 |
實務應用:環境設定
<?php
// config.php
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'myapp');
define('DB_USER', 'dbuser');
define('DB_PASS', 'secret');
define('DEBUG_MODE', true);
// 使用
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
if (DEBUG_MODE) {
ini_set('display_errors', 1);
error_reporting(E_ALL);
}
?>
陣列常數
<?php
define('ALLOWED_EXTS', ['jpg', 'jpeg', 'png', 'gif', 'webp']);
define('ROUTE_MAP', [
'home' => 'HomeController@index',
'login' => 'AuthController@login'
]);
// 存取
echo ALLOWED_EXTS[0]; // jpg
echo ROUTE_MAP['login']; // AuthController@login
?>
const vs define
const:編譯期定義,僅限類別內或最上層命名空間,不可在條件判斷中動態定義,語法更簡潔,效能略優。
define():執行期定義,可動態決定名稱與值,支援大小寫不敏感(不建議使用)。
<?php
const API_VERSION = 'v1'; // 推薦用於類別常數或全域常數
define('API_VERSION_2', 'v2'); // 需動態時使用
?>