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

PHP defined() 與 strrchr() 函數深度解析與實戰範例

     編輯:PHP 相關知識

defined():檢查常數是否定義

語法與回傳值

defined(string $constant_name): bool
  • 常數存在 → true
  • 常數不存在 → false

注意:參數必須是字串形式的常數名稱,不可加 $ 符號。

基本範例

<?php
define('APP_VERSION', '2.1.0');
define('DEBUG_MODE', true);

var_dump(defined('APP_VERSION'));   // bool(true)
var_dump(defined('DEBUG_MODE'));    // bool(true)
var_dump(defined('NON_EXISTENT'));  // bool(false)

// 條件編譯風格
if (defined('DEBUG_MODE') && DEBUG_MODE) {
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
}
?>

進階用法:動態常數名

<?php
$prefix = 'DB_';
$env = 'PROD'; // 或 'DEV'
$constName = $prefix . $env . '_HOST';

if (defined($constName)) {
    $host = constant($constName); // 取得常數值
    echo "連線主機: $host";
} else {
    throw new Exception("環境 $env 資料庫主機常數未定義");
}
?>

strrchr():查找字串最後一次出現位置並回傳剩餘部分

語法與參數

strrchr(string $haystack, string $needle): string|false
  • $haystack:被搜尋字串
  • $needle:搜尋目標(單字元或字串)。若為整數,視為 ASCII 碼對應字元。

回傳:從 $needle 最後一次出現位置(含本身)到字串結尾的子字串;找不到回傳 false。

範例集錦

<?php
$path = '/var/www/html/project/public/index.php';

// 1. 取得檔名(最後一個 / 之後)
$filename = strrchr($path, '/'); // '/index.php'
echo basename($filename);        // 'index.php' (更推薦用 basename())

// 2. 取得副檔名(最後一個 . 之後)
$ext = strrchr($filename, '.');  // '.php'

// 3. 字串搜尋
echo strrchr('Hello world!', 'world'); // 'world!'
echo strrchr('Hello world!', 'o');     // 'orld!'

// 4. 整數參數視為 ASCII
echo strrchr('Hello world!', 111); // 'orld!' (111 = 'o')

// 5. 找不到
var_dump(strrchr('abc', 'z')); // bool(false)
?>

實戰:解析 Data URI / MIME 類型

<?php
$dataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...';

// 取得 MIME 類型
$mimePart = strstr($dataUri, ';', true); // 'data:image/png' (PHP 5.3+)
$mime = strrchr($mimePart, ':'); // ':image/png'
$mime = ltrim($mime, ':');       // 'image/png'

echo "MIME: $mime"; // image/png
?>

常見誤區對比

函數常見錯誤正確用法
defined()defined(APP_VERSION) → 常數當變數用,觸發 Noticedefined('APP_VERSION')
strrchr()以為回傳位置索引回傳的是子字串,需配合 strlen/strpos 取位置
strrchr()多字元 needle 只匹配第一字元strrchr 只支援單字元搜尋;多字元請用 strrpos + substr

總結

  • defined() 是條件編譯、配置檢查的基石,配合 constant() 實現動態常數存取。
  • strrchr() 適合「從右邊切割」場景:取副檔名、解析路徑、提取協議後綴。複雜解析請改用 parse_url、pathinfo 或正則。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved