首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 語言基礎進階:常量、運算子與型別轉換規則詳解

     編輯:PHP 相關知識

02.1 常量定義與特性

<?php
define('CONSTANT_NAME', 'value', true);  // 第三參數:true=不區分大小寫,預設 false
// 常見用法
define('APP_VERSION', '1.0.0');
define('DB_CONFIG', ['host'=>'localhost', 'port'=>3306]);  // PHP 7+ 支援陣列常量
?>
  • 常量一旦定義不可變更、不可銷毀(unset() 無效)。
  • 命名慣例:全大寫 + 底線分隔(MAX_UPLOAD_SIZE)。
  • 區分大小寫預設為 true,建議保持預設避免混淆。
  • 可用 defined('NAME') 檢查是否已定義。

02.2 運算子分類與型別轉換核心規則

三大運算子類型

  1. 一元運算子:++ -- ~ @ 等(單一運算元)
  2. 二元運算子:算術、比較、邏輯、字串串接 .、指派等(雙運算元)
  3. 三元運算子:?:(三運算元)

PHP 型別轉換「向寬轉換」鐵律

運算時會自動將型別轉換為「表示範圍最寬」的類型,不可逆轉(避免資料遺失):

  1. 字串 → 整數 → 浮點數:'123' + 1.5 = 124.5
  2. 布林/Null/Resource → 整數:false=0, true=1, null=0, resource=資源ID
  3. 陣列/物件不可直接參與算術運算(會拋出 TypeError/Warning)。

02.2.1 字串串接運算子 . 專屬規則

  • 只處理字串:任何非字串運算元會先強制轉字串再串接。
  • 類似 C++ 運算子多載:運算子定義操作型別為 string,編譯期隱式轉型。
<?php
$year = 2024;
echo '今年是' . $year . '年';  // $year 內部轉為 '2024' 再串接
// 輸出:今年是2024年
?>

02.2.2 參考指派 =& 與函數參考回傳

<?php
$name = 'Judy';
$alias = &$name;   // $alias 成為 $name 別名(類似 C++ 參考)
$alias = 'Jonathan';
echo $name;  // 輸出:Jonathan

// 函數參考回傳
function &getConfig() {
    static $config = ['debug' => true];
    return $config;
}
$cfg = &getConfig();  // 必須雙端加 &
$cfg['debug'] = false;
?>

本質:PHP 參考底層仍是 C 指標機制,指向同一個 zval 容器。

02.3 比較運算子:== vs === vs !==

運算子名稱規則範例結果
==相等值相等經過型別轉換1 == '1' → true, 0 == 'abc' → true
===全等值相等且型別相同,不轉型1 === '1' → false, 1 === 1 → true
!==不全等=== 取反1 !== '1' → true

經典陷阱:0 == '任意非數字字串' 為 true

<?php
var_dump(0 == 'hello');   // true  ← 字串轉整數 = 0
var_dump(0 === 'hello');  // false
var_dump('0' == '0.0');   // true  ← 數值比較
var_dump('0' === '0.0');  // false
?>

鐵律:除非極確定型別一致,永遠優先使用 ===/!==,避免隱式轉型導致邏輯錯誤。

實戰最佳實踐

  1. 常量集中管理:建立 config/constants.php 統一定義,避免魔術數字散落。
  2. 嚴格比較:預設用 ===,只有確需型別轉換語意時才用 ==。
  3. 參考慎用:僅在大陣列傳遞、需修改外部變數、效能極度敏感時使用,否則降低可讀性。
  4. 啟用 declare(strict_types=1)(PHP 7+)強制函數參數/回傳型別檢查,從根源杜絕隱式轉型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved