PHP語法基礎

PHP語法基礎

一,變量

在PHP中,變量是存儲數據的容器,其靈活性和動態類型系統是PHP的核心特性之一。以下是PHP變量的詳細解析,涵蓋聲明、作用域、類型轉換及最佳實踐:


1. 變量基礎

聲明與命名規則
  • 無需顯式聲明類型:PHP是動態類型語言,變量類型由賦值決定。

  • $符號開頭

    $name = "Alice";  // 字符串
    $age = 25;        // 整數
    $price = 19.99;   // 浮點數
    $isActive = true; // 布爾值
    
  • 命名規則

    • 以字母或下劃線開頭,后可接字母、數字、下劃線。
    • 區分大小寫($Var$var不同)。
變量類型

PHP支持8種原始數據類型:

類型示例描述
整型(int)$count = 100;無小數點的整數
浮點型(float)$price = 9.99;含小數點的數或科學計數法表示
字符串(string)$text = "Hello";文本(單引號或雙引號包裹)
布爾型(bool)$isValid = true;truefalse
數組(array)$colors = ["red", "blue"];有序鍵值對集合
對象(object)$user = new User();類的實例化
NULL$data = null;表示變量無值
資源(resource)$file = fopen("a.txt");外部資源句柄(如文件、數據庫連接)

2. 變量作用域

作用域分類
  1. 局部變量
    在函數內部聲明,僅函數內有效。

    function test() {$localVar = "Inside function"; // 局部變量echo $localVar;
    }
    test(); // 輸出 "Inside function"
    echo $localVar; // 報錯:未定義變量
    
  2. 全局變量
    在函數外部聲明,需通過global關鍵字或$GLOBALS數組訪問。

    $globalVar = "Outside function";
    function readGlobal() {global $globalVar;echo $globalVar; // 輸出 "Outside function"
    }
    
  3. 靜態變量
    使用static關鍵字,函數多次調用時保留值。

    function counter() {static $count = 0;$count++;echo $count;
    }
    counter(); // 1
    counter(); // 2
    
  4. 超全局變量
    預定義全局數組,跨作用域直接訪問,如:

    • $_GET:獲取URL參數。
    • $_POST:接收表單POST數據。
    • $_SESSION:會話變量。
    • $_SERVER:服務器信息(如$_SERVER['REQUEST_URI'])。

3. 變量處理技巧

可變變量(Variable Variables)
  • 通過變量名動態訪問變量:

    $varName = "message";
    $$varName = "Hello!"; // 等價于 $message = "Hello!";
    echo $message; // 輸出 "Hello!"
    
引用變量(By Reference)
  • 使用&創建變量別名,修改引用會同步原變量:

    $a = 10;
    $b = &$a;
    $b = 20;
    echo $a; // 輸出 20
    
類型檢測與轉換
  • 檢測類型

    $value = "123";
    var_dump(is_int($value));   // bool(false)
    var_dump(is_numeric($value)); // bool(true)
    
  • 強制類型轉換

    $num = (int)"42.5";    // 轉為整型(42)
    $str = (string)100;    // 轉為字符串("100")
    

4. 安全性注意事項

  1. 未初始化變量
    直接使用未賦值變量會觸發E_WARNING,建議初始化:

    // 錯誤示例
    echo $undefinedVar; // 警告:Undefined variable
    // 正確做法
    $undefinedVar = isset($undefinedVar) ? $undefinedVar : "default";
    
  2. 用戶輸入過濾
    $_GET$_POST等輸入進行過濾,避免安全漏洞:

    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    
  3. 避免直接輸出用戶數據
    防止XSS攻擊,使用htmlspecialchars轉義:

    echo htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
    

5. 最佳實踐

  • 命名規范
    使用駝峰式($userName)或蛇形命名($user_name),保持一致性。

  • 類型聲明(PHP 7+)
    通過嚴格類型提升代碼可預測性:

    declare(strict_types=1); // 啟用嚴格模式
    function add(int $a, int $b): int {return $a + $b;
    }
    
  • 使用===比較
    避免類型轉換導致的意外結果:

    if (0 == "0") { // true(松散比較)
    if (0 === "0") { // false(嚴格比較)
    

總結

特性說明示例
動態類型變量類型由賦值決定$x = "text"; $x = 10;
作用域控制局部、全局、靜態作用域區分清晰global, static
超全局變量直接訪問用戶輸入、會話等數據$_POST['email']
類型轉換與檢測靈活轉換但需注意安全性(int), is_array()
引用與可變變量動態操作變量名或別名$$var, $a = &$b

二,常量

在PHP中,常量是一種不可變的值,一旦定義后無法修改或重新聲明。常量的全局性和持久性使其適合存儲配置參數、固定值或全局標識符。以下是PHP常量的詳細解析,涵蓋定義方式、作用域、使用場景及最佳實踐:


1. 常量的定義方式

(1) 使用 define() 函數
  • 語法

    define(string $name, mixed $value [, bool $case_insensitive = false])
    
  • 特點

    • 可在運行時動態定義(例如在條件語句或函數內)。
    • 支持定義大小寫不敏感的常量(不推薦,PHP 7.3+已廢棄此特性)。

示例

define("SITE_NAME", "MyWebsite");
define("MAX_USERS", 1000, true); // 不推薦使用大小寫不敏感
echo SITE_NAME; // 輸出 "MyWebsite"
(2) 使用 const 關鍵字
  • 語法

    const CONSTANT_NAME = value;
    
  • 特點

    • 必須在編譯時定義(不能在函數、循環或條件語句中使用)。
    • 代碼更簡潔,推薦在類或全局作用域使用。

示例

const API_KEY = "abc123";
const PI = 3.14159;
echo PI; // 輸出 3.14159

2. 常量與變量的區別

特性常量變量
定義方式define()const$var = value;
作用域全局(跨函數、類訪問)局部或全局(需global聲明)
可變性不可重新賦值或取消定義可隨時修改
命名規則默認區分大小寫,推薦全大寫加下劃線區分大小寫,自由命名
數據類型支持標量(int, string等)和數組(PHP7+)支持所有PHP數據類型

3. 常量的作用域

  • 全局性:常量一旦定義,可在腳本的任何位置訪問(包括函數、類內部)。

  • 示例

    define("VERSION", "1.0.0");function showVersion() {echo "版本號:" . VERSION; // 直接訪問
    }class App {public function getVersion() {return VERSION; // 類內訪問}
    }
    

4. 常量的命名與規范

  • 命名規則
    • 以字母或下劃線開頭,后接字母、數字、下劃線。
    • 傳統約定:全大寫字母 + 下劃線分隔(如 DB_HOST)。
  • 避免沖突
    • 不要使用PHP保留關鍵字(如 __CLASS__)。
    • 使用唯一的前綴減少命名沖突(如項目縮寫 MYAPP_LOGO_PATH)。

5. 預定義常量

PHP中最常見的預定義常量及其用途:

常量名稱類型/分類描述示例值
__LINE__魔術常量當前行號(在腳本中的位置)42
__FILE__魔術常量當前文件的完整路徑和文件名/var/www/app/index.php
__DIR__魔術常量當前文件所在目錄的路徑/var/www/app
__FUNCTION__魔術常量當前函數名稱calculateTotal
__CLASS__魔術常量當前類名UserService
__METHOD__魔術常量當前類方法名(包含類名)UserService::getProfile
__NAMESPACE__魔術常量當前命名空間名稱MyApp\Utils
PHP_VERSION環境/系統常量PHP解釋器的版本號"8.2.0"
PHP_OS環境/系統常量運行PHP的操作系統類型"Linux""WINNT"
PHP_INT_MAX環境/系統常量整數最大值(64位系統為92233720368547758079223372036854775807
PHP_FLOAT_EPSILON環境/系統常量浮點數最小差值(PHP 7.2+)2.2204460492503E-16
DIRECTORY_SEPARATOR環境/系統常量目錄分隔符(Linux為/,Windows為\"/""\\"
PATH_SEPARATOR環境/系統常量路徑分隔符(Linux為:,Windows為;":"";"
E_ERROR錯誤處理常量致命運行時錯誤(不可恢復的錯誤)1
E_WARNING錯誤處理常量運行時非致命警告(腳本繼續執行)2
E_PARSE錯誤處理常量編譯時語法解析錯誤4
E_NOTICE錯誤處理常量運行時提示(可能的代碼問題,如訪問未定義變量)8
E_ALL錯誤處理常量所有錯誤和警告(通常用于error_reporting設置)32767(PHP 8.1+)
TRUE/FALSE/NULL布爾與空值常量布爾值truefalse和空值nulltrue, false, null
SORT_ASC/SORT_DESC數組排序常量數組升序(SORT_ASC)或降序(SORT_DESC4(升序), 3(降序)
其他常用常量
JSON_ERROR_NONEJSON處理常量JSON解析無錯誤0
ENT_QUOTESHTML轉義常量轉義單引號和雙引號(用于htmlspecialcharsENT_QUOTES 的值為 3

使用場景示例

  1. 調試時獲取上下文信息

    echo "當前文件:" . __FILE__ . ",第" . __LINE__ . "行";
    // 輸出:當前文件:/app/index.php,第30行
    
  2. 動態加載文件

    require __DIR__ . '/config/database.php';
    
  3. 錯誤報告配置

    error_reporting(E_ALL); // 報告所有錯誤
    
  4. 跨平臺路徑處理

    $file = 'data' . DIRECTORY_SEPARATOR . 'logs.txt';
    

擴展說明

  • 魔術常量:以雙下劃線開頭和結尾,值隨上下文變化(如所在文件、行號等)。
  • 環境常量:反映PHP配置和運行環境,常用于編寫跨平臺兼容代碼。
  • 錯誤級別常量:通過位掩碼組合使用(如error_reporting(E_ERROR | E_WARNING))。

6. 常量的使用場景

  1. 配置參數
    存儲數據庫連接信息、API密鑰等。

    define("DB_HOST", "localhost");
    define("DB_USER", "root");
    define("DB_PASS", "secret");
    
  2. 狀態標識
    定義應用狀態(如開發、生產模式)。

    const ENV_MODE = "development";
    
  3. 避免魔法數值
    用常量替代代碼中的字面量,提升可讀性。

    const MAX_LOGIN_ATTEMPTS = 5;
    if ($attempts > MAX_LOGIN_ATTEMPTS) {throw new Exception("登錄嘗試次數過多");
    }
    

7. 常量操作函數

  • 檢測常量是否存在

    if (defined("VERSION")) {echo "常量已定義";
    }
    
  • 獲取所有已定義常量

    $allConstants = get_defined_constants();
    print_r($allConstants);
    

8. 注意事項與最佳實踐

  1. 不可重復定義
    重復定義常量會導致 PHP Warning

    define("SITE_NAME", "OldSite");
    define("SITE_NAME", "NewSite"); // 觸發警告
    
  2. 數組常量(PHP7+)
    使用 define() 定義數組常量:

    define("COLORS", ["red", "green", "blue"]);
    echo COLORS[0]; // 輸出 "red"
    
  3. 類常量
    在類中定義常量,支持可見性修飾符(PHP7.1+):

    class User {public const ROLE_ADMIN = "admin";private const MAX_AGE = 120;
    }
    echo User::ROLE_ADMIN; // 輸出 "admin"
    
  4. 性能優化
    常量在編譯時解析,訪問速度略快于全局變量。


總結

操作代碼示例
定義常量(define()define("API_URL", "https://api.example.com");
定義常量(constconst TIMEOUT = 30;
訪問常量echo API_URL;
檢測常量if (defined("TIMEOUT")) { ... }

核心原則

  • 優先使用 const(除非需要動態定義)。
  • 通過常量集中管理全局不可變值,增強代碼可維護性。
  • 遵循命名規范,避免與系統常量沖突。

三,數據類型分類

PHP的數據類型可以分為標量類型、復合類型、特殊類型以及偽類型。以下是詳細分類和說明:


一、標量類型(Scalar Types)

  1. 整型(Integer)

    • 表示整數,帶符號(支持正負),取值范圍依賴于平臺(32位或64位)。
    • 可用進制:十進制(123)、十六進制(0x1A)、八進制(0123)、二進制(0b1110)。
    • 示例:$a = 42;
    • 類型檢測:is_int()is_integer()
  2. 浮點型(Float/Double)

    • 表示小數或科學計數法數值(如 1.2e3)。
    • 精度問題:浮點數計算可能存在精度丟失(如 0.1 + 0.2 != 0.3)。
    • 示例:$b = 3.14;
    • 類型檢測:is_float()
  3. 字符串(String)

    • 表示文本,支持單引號(不解析變量)、雙引號(解析變量和轉義字符)、Heredoc和Nowdoc語法。

    • 示例:

      $str1 = 'Hello';  
      $str2 = "World: $str1";  
      $str3 = <<<EOD  
      Multiline  
      EOD;  
      
    • 類型檢測:is_string()

  4. 布爾型(Boolean)

    • 僅兩個值:truefalse(不區分大小寫,如 TRUE 也有效)。
    • 轉換為 false 的情況:空字符串、0null、空數組等。
    • 示例:$flag = true;
    • 類型檢測:is_bool()

二、復合類型(Compound Types)

  1. 數組(Array)

    • 有序鍵值對集合,鍵可以是整型或字符串,值可為任意類型。

    • 示例:

      $arr = [1 => "a", "name" => "PHP"];
      
    • 類型檢測:is_array()

  2. 對象(Object)

    • 類的實例,包含屬性和方法。

    • 示例:

      class MyClass {}  
      $obj = new MyClass();
      
    • 類型檢測:is_object()

  3. 可調用(Callable)

    • 表示可調用的結構,如函數、方法、閉包或實現 __invoke() 的對象。

    • 示例:

      $callable = function() { echo "Hello"; };
      
    • 類型檢測:is_callable()

  4. 可迭代(Iterable)

    • PHP 7.1+ 引入,可以是數組或實現 Traversable 接口的對象(如生成器)。

    • 示例:

      function gen(): iterable { yield 1; }
      
    • 類型檢測:is_iterable()


三、特殊類型(Special Types)

  1. 空值(Null)
    • 唯一值 null,表示變量未賦值或已銷毀(unset())。
    • 示例:$var = null;
    • 類型檢測:is_null()
  2. 資源(Resource)
    • 外部資源句柄(如文件、數據庫連接),由擴展創建。
    • 示例:$file = fopen("test.txt", "r");
    • 類型檢測:is_resource()。資源釋放后變量可能轉為 null

四、偽類型(Pseudo-Types)

  • mixed
    表示任意類型(PHP 8.0+ 作為聯合類型的一部分)。
  • void
    表示無返回值(用于函數聲明)。
  • 其他
    number(int 或 float)、array|object 等,用于文檔說明。

注意事項

  • 字符串與數字轉換
    "123abc" 轉整型為 123"abc123" 轉整型為 0
  • 數組鍵類型
    字符串鍵 "8" 會轉為整型 8,但 "08" 保留為字符串。
  • 資源管理
    資源需顯式釋放(如 fclose()),釋放后變量可能變為 null
  • PHP版本差異
    PHP 8 中部分資源改為對象(如 PDO 相關),需注意兼容性。

四,數據類型轉換

1.自動類型轉換(隱式轉換)

PHP 在表達式求值時會自動轉換數據類型,例如:

$sum = 5 + "10";  // 15("10" 被轉換為整數)
$sum = 5 + "10.5"; // 15.5("10.5" 被轉換為浮點數)

轉換規則:

  1. 字符串 → 數字

    • 只要字符串以數字開頭,PHP 就會轉換它。
    • 遇到非數字字符時,轉換會停止。
    echo (int)"123abc";  // 輸出 123
    echo (int)"abc123";  // 輸出 0(無效轉換)
    
  2. 布爾值轉換

    • false 轉換為 0true 轉換為 1
    echo true + 1;  // 輸出 2
    echo false + 1; // 輸出 1
    
  3. 空字符串、NULL 轉換

    • 空字符串 ""NULL 轉換為 0
    echo (int)NULL;    // 0
    echo (int)"";      // 0
    
  4. 數組轉換

    • 數組轉換為整數時,始終返回 1(如果是空數組,則返回 0)。
    echo (int)[1, 2, 3]; // 1
    echo (int)[];        // 0
    

2. 顯式類型轉換(強制轉換)

顯式轉換使用 (type) 語法:

$var = "100";
$intVar = (int)$var;      // 100
$floatVar = (float)$var;  // 100.0
$boolVar = (bool)$var;    // true

PHP 提供以下顯式轉換:

  • (int) 或 (integer) - 轉換為整數
  • (bool) 或 (boolean) - 轉換為布爾值
  • (float) 或 (double) 或 (real) - 轉換為浮點數
  • (string) - 轉換為字符串
  • (array) - 轉換為數組
  • (object) - 轉換為對象
  • (unset) - 轉換為 NULL

示例:

echo (int)"123abc";  // 123
echo (bool)0;        // false
echo (float)"3.14abc"; // 3.14

3. 類型轉換函數

PHP 提供了一些函數來進行數據類型轉換:

函數作用
intval($var)轉換為整數
floatval($var)轉換為浮點數
boolval($var)轉換為布爾值
strval($var)轉換為字符串
settype($var, "type")直接改變變量類型

示例:

$var = "123abc";
echo intval($var);  // 123
echo floatval("3.14abc"); // 3.14
echo boolval(0);    // false

settype() 會直接修改變量的類型:

$var = "100";
settype($var, "int");
echo $var;  // 100(已變為整數)

4. 特殊轉換

(1)字符串和數組轉換

  • 字符串 → 數組

    • (array) 強制轉換時,字符串會變成數組,索引 0 處存儲整個字符串。
    $str = "Hello";
    $arr = (array)$str;
    print_r($arr);
    

    輸出:

    Array ( [0] => Hello )
    
  • 數組 → 字符串

    • 數組轉換為字符串時,返回 "Array"
    $arr = [1, 2, 3];
    echo (string)$arr; // 輸出 "Array"
    

(2)對象和數組轉換

  • 對象 → 數組

    class Test {public $a = 1;private $b = 2;protected $c = 3;
    }$obj = new Test();
    $arr = (array)$obj;
    print_r($arr);
    

    輸出:

    Array ( [a] => 1 [\0Test\0b] => 2 [\0*\0c] => 3 )
    

    (私有和受保護屬性在數組中有特殊鍵)

  • 數組 → 對象

    $arr = ["name" => "PHP", "version" => 8];
    $obj = (object)$arr;
    echo $obj->name;  // PHP
    

(3)JSON 和數據類型轉換

PHP 提供 json_encode()json_decode() 進行轉換:

$arr = ["name" => "PHP", "version" => 8];
$json = json_encode($arr);   // 轉換為 JSON 字符串
$obj = json_decode($json);   // 轉換為對象
print_r($obj);

5. 類型轉換注意事項

  1. 字符串轉換為數字時,非數字部分被忽略

    echo (int)"10abc"; // 10
    
  2. 浮點數轉換為整數時會截斷

    echo (int)3.99; // 3
    
  3. 布爾值轉換

    • 空數組、空字符串、NULL0 轉換為 false,其余為 true
    echo (bool)"";  // false
    echo (bool)"0"; // false
    echo (bool)"abc"; // true
    
  4. JSON 解析

    • 默認 json_decode() 返回對象,使用 true 作為第二個參數返回數組:
    $arr = json_decode('{"a":1,"b":2}', true);
    print_r($arr);
    

結論

PHP 的數據類型轉換相對寬松,允許隱式轉換,但容易導致意外結果。最佳實踐:

  • 使用顯式轉換 ((int), (string), (bool))
  • 使用轉換函數 (intval(), floatval(), boolval())
  • 避免依賴隱式轉換(如 if ($var) 可能帶來意外行為)
  • JSON 數據轉換時注意數據結構(使用 true 作為參數轉換為數組)

五,整數類型進制

1. 十進制轉換為其他進制

PHP 提供了內置函數來進行轉換:

  • decbin($num):十進制 → 二進制
  • decoct($num):十進制 → 八進制
  • dechex($num):十進制 → 十六進制

示例代碼:

$num = 45;echo decbin($num) . PHP_EOL; // 輸出: 101101(二進制)
echo decoct($num) . PHP_EOL; // 輸出: 55(八進制)
echo dechex($num) . PHP_EOL; // 輸出: 2d(十六進制)

2. 其他進制轉換為十進制

  • bindec($num):二進制 → 十進制
  • octdec($num):八進制 → 十進制
  • hexdec($num):十六進制 → 十進制

示例代碼:

echo bindec("101101") . PHP_EOL; // 輸出: 45
echo octdec("55") . PHP_EOL;     // 輸出: 45
echo hexdec("2d") . PHP_EOL;     // 輸出: 45

3. 任意進制轉換(2-36 進制)

如果需要在任意進制之間轉換,可以使用 base_convert($num, $fromBase, $toBase) 函數。

示例代碼:

echo base_convert("101101", 2, 10) . PHP_EOL; // 二進制轉十進制,輸出 45
echo base_convert("45", 10, 16) . PHP_EOL;   // 十進制轉十六進制,輸出 2d
echo base_convert("2d", 16, 8) . PHP_EOL;    // 十六進制轉八進制,輸出 55
echo base_convert("55", 8, 2) . PHP_EOL;     // 八進制轉二進制,輸出 101101

?? 注意: base_convert() 適用于 2-36 進制之間的轉換,如果超出范圍,需要使用其他方法實現。


4. 自定義進制轉換(支持更高進制)

如果需要支持超過 36 進制(例如 62 進制),可以自定義實現:

function custom_base_convert($num, $fromBase, $toBase) {$digits = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';$decimal = 0;// 先轉為十進制for ($i = 0, $len = strlen($num); $i < $len; $i++) {$decimal = $decimal * $fromBase + strpos($digits, $num[$i]);}// 再從十進制轉換為目標進制$result = '';while ($decimal > 0) {$result = $digits[$decimal % $toBase] . $result;$decimal = intval($decimal / $toBase);}return $result ?: '0';
}echo custom_base_convert("2d", 16, 62); // 十六進制轉 62 進制

總結

函數作用
decbin($num)十進制 → 二進制
decoct($num)十進制 → 八進制
dechex($num)十進制 → 十六進制
bindec($num)二進制 → 十進制
octdec($num)八進制 → 十進制
hexdec($num)十六進制 → 十進制
base_convert($num, $fromBase, $toBase)任意進制轉換(2-36)
自定義函數超過 36 進制轉換

六,浮點型數據

1. 定義浮點數

  • 直接賦值:

    $a = 3.14;
    $b = -0.001;
    
  • 科學計數法:

    $c = 1.2e3; // 1200
    $d = 5E-3;   // 0.005
    

2. 精度問題

  • 二進制表示誤差:某些十進制小數(如0.1)無法精確表示為二進制浮點數,導致計算誤差。

    echo 0.1 + 0.2; // 輸出 0.30000000000000004,而非精確的0.3
    
  • 比較浮點數:避免直接使用==,改用差值比較:

    $epsilon = 1e-10;
    if (abs($a - $b) < $epsilon) {echo "相等";
    }
    

3. 特殊值

  • NAN(非數值):無效運算結果(如sqrt(-1))。

  • INF(無窮大):超出浮點數范圍的值(如1e300 * 1e300)。

  • 檢測方法:

    is_nan($value);   // 檢測是否為NAN
    is_infinite($value); // 檢測是否為INF
    

4. 類型轉換與判斷

  • 顯式轉換

    $float = (float)"3.14"; // 字符串轉浮點數
    $float = floatval("3.14");
    
  • 類型檢測

    is_float($a);      // true
    var_dump($a);      // 輸出 float(3.14)
    

5. 范圍與常量

  • 最大值/最小值

    echo PHP_FLOAT_MAX; // 1.7976931348623e+308(平臺相關)
    echo PHP_FLOAT_MIN; // 2.2250738585072e-308(最小正浮點數)
    

6. 運算與自動轉換

  • 混合類型運算時,結果自動轉為浮點型:

    echo 5 + 2.5; // 輸出 7.5(浮點數)
    

7. 格式化輸出

  • 控制顯示精度:

    echo number_format(0.1 + 0.2, 2); // 輸出 0.30
    echo sprintf("%.2f", 0.1 + 0.2);  // 輸出 0.30
    

8. 注意事項

  • 避免作為數組鍵:浮點數鍵會轉換為整數,可能導致沖突。
  • 高精度需求:使用BC MathGMP擴展處理精確計算(如財務數據)。

示例代碼

// 浮點數定義與精度問題
$num1 = 0.1;
$num2 = 0.2;
$sum = $num1 + $num2; // ~0.30000000000000004// 正確比較方式
if (abs($sum - 0.3) < 1e-10) {echo "實際相等";
}// 特殊值檢測
$nan = acos(8); // 無效反余弦值
if (is_nan($nan)) {echo "這是非數值";
}

總結

  • 浮點數適用于科學計算或無需高精度的場景。
  • 精確計算(如貨幣)建議使用整數(如分單位)或DECIMAL類型(數據庫中)。
  • 始終警惕精度誤差,合理選擇比較方法和運算庫。

七,布爾型數據

一、布爾型的基本概念

布爾型(Boolean)是PHP中最簡單的數據類型,只有兩個可能的值:

  • true(邏輯真)
  • false(邏輯假)

布爾型通常用于條件判斷(如 ifwhile 語句)中控制程序流程。¥val


二、定義布爾值

1. 直接賦值
$isTrue = true;
$isFalse = false;
2. 不區分大小寫的常量

PHP中布爾常量不區分大小寫,但推薦使用小寫以保持代碼規范:

$a = TRUE;   // 有效,但建議使用小寫
$b = False;  // 有效

三、布爾轉換規則

PHP是弱類型語言,其他類型值在需要時會自動轉換為布爾值。以下是轉換規則:

1. 視為 false 的值

以下值在轉換為布爾型時會被認為是 false

  • 整型 0、浮點型 0.0
  • 空字符串 "" 和字符串 "0"
  • 空數組 []array()
  • null
  • 特殊對象(如空SimpleXMLElement對象)
2. 視為 true 的值

其他所有值均被視為 true,包括:

  • 非零數字(如 1, -1, 3.14
  • 非空字符串(如 "false"" "
  • 非空數組(如 [0]
  • 資源(Resource)類型
  • 所有對象(即使是空對象)

四、類型檢測與轉換

1. 檢測布爾類型

使用 is_bool() 函數:

var_dump(is_bool(true));   // 輸出 bool(true)
var_dump(is_bool("true")); // 輸出 bool(false)
2. 顯式轉換

通過強制類型轉換或函數:

$value = (bool) "Hello";    // 轉為 true
$value = boolval(0);        // 轉為 false

五、布爾型在條件判斷中的應用

在控制結構中,表達式會自動轉換為布爾值

if ("0") {          // 字符串 "0" 轉換為 falseecho "會執行嗎?";
} else {echo "這里會被執行!";
}// 輸出:這里會被執行!

六、常見陷阱與注意事項

1. 字符串 "0" 的特殊性
$str = "0";
var_dump((bool)$str); // 輸出 bool(false)
2. 非空數組的轉換
$arr = [0];
var_dump((bool)$arr); // 輸出 bool(true)
3. 對象始終為 true
$obj = new stdClass();
var_dump((bool)$obj); // 輸出 bool(true)
4. 布爾值與字符串拼接
echo "結果為:" . true;  // 輸出 "結果為:1"
echo "結果為:" . false; // 輸出 "結果為:"

七、最佳實踐

  1. 顯式比較
    避免依賴隱式轉換,使用嚴格比較(===):

    if ($value === true) {// 明確檢查布爾值
    }
    
  2. 處理表單/外部輸入
    從表單或數據庫獲取的數據需顯式轉換:

    $isActive = (bool)$_POST['is_active'];
    
  3. 高可讀性代碼
    避免直接使用 if ($var),明確條件含義:

    // 不推薦
    if ($user) { ... }// 推薦
    if ($user !== null) { ... }
    

八、示例代碼

// 布爾值的定義與轉換
$value1 = 0;
$value2 = "Hello";var_dump((bool)$value1); // bool(false)
var_dump((bool)$value2); // bool(true)// 條件判斷中的自動轉換
if ([]) {echo "空數組為真?";
} else {echo "空數組為假!"; // 輸出此句
}// 嚴格類型檢查
$flag = "true";
if ($flag === true) {echo "嚴格模式不會執行!";
}

總結

  • 布爾型用于表示邏輯真/假,是條件判斷的核心。
  • 理解隱式轉換規則可避免邏輯錯誤。
  • 在關鍵場景中使用顯式轉換和嚴格比較(===)以提高代碼健壯性。

八,運算符

一、算術運算符

用于數學計算,支持數值類型操作:

$a = 10;
$b = 3;echo $a + $b;   // 13(加法)
echo $a - $b;   // 7(減法)
echo $a * $b;   // 30(乘法)
echo $a / $b;   // 3.333...(除法)
echo $a % $b;   // 1(取模,余數符號與被除數一致)
echo $a ** $b;  // 1000(冪運算,PHP 5.6+)

注意:除法 / 總是返回浮點數(除非能整除)。


二、比較運算符

用于值比較,返回布爾值 truefalse

運算符名稱示例說明
==松散等于5 == "5"true值相等,忽略類型
===嚴格等于5 === "5"false值和類型均相等
!=松散不等于5 != "5"false值不相等
<>松散不等于!=
!==嚴格不等于5 !== "5"true值或類型不同
<小于3 < 5true
>大于3 > 5false
<=小于等于5 <= 5true
>=大于等于5 >= 3true
<=>太空船運算符5 <=> 31PHP7+,返回-1,0,1表示比較結果

三、邏輯運算符

用于組合條件,支持短路求值:

運算符名稱示例說明
&&邏輯與$a && $b兩者為真則真,優先級高于 and
|邏輯或$a || $b任一為真則真,優先級高于 or
!邏輯非!$a取反
and邏輯與$a and $b功能同 &&,但優先級更低
or邏輯或$a or $b功能同 ||,優先級更低
xor邏輯異或$a xor $b僅一真則真,否則假

注意

  • &&|| 優先級高于 andor,可能導致邏輯錯誤:

    $result = false && true;  // → false(等價于 (false) && true)
    $result = false and true; // → false(等價于 ($result = false) and true)
    
  • 短路求值:若左操作數已確定結果,右操作數不執行:

    false && expensiveFunction(); // 不會調用函數
    

四、位運算符

對整數的二進制位進行操作:

運算符名稱示例說明
&按位與5 & 31二進制位同為1則結果位為1
|按位或5 | 37任一二進制位為1則結果位為1
^按位異或5 ^ 36二進制位不同則結果位為1
~按位取反~5-60變1,1變0(結果依賴整數位數)
<<左移5 << 110左移指定位數,右側補0
>>右移5 >> 12右移指定位數,左側補符號位

應用場景:權限控制、標志位處理。

計算機碼的基本概念

計算機存儲數據時通常采用 定長二進制,尤其是整數。負數的表示方式一般有三種主要編碼方式:

  1. 原碼(Sign-Magnitude Representation)

    • 最高位(最左側)作為符號位:0 表示正數,1 表示負數。
    • 剩余部分表示數值的絕對值。
    • 缺點:正負零的表示不同,且計算復雜。

    示例(8位存儲)

    • +500000101
    • -510000101
  2. 反碼(One’s Complement)

    • 正數的表示與原碼相同。
    • 負數的表示是對原碼的數值部分按位取反(0 變 1,1 變 0)。
    • 存在兩個零 (+0-0),仍然不便于計算。

    示例(8位存儲)

    • +500000101
    • -511111010(取反)
  3. 補碼(Two’s Complement,計算機中最常用的表示方式)

    • 正數的表示與原碼相同。
    • 負數的表示是反碼 + 1(取反后加 1)。
    • 補碼的優點:
      • 計算更方便(加減法可直接使用二進制加法)。
      • 只有一種零表示方式 (00000000)。

    示例(8位存儲)

    • +500000101
    • -511111011(先取反 11111010,再加 1

五、賦值運算符

為變量賦值,支持組合操作:

運算符示例等價于
=$a = 5直接賦值
+=$a += 3$a = $a + 3
-=$a -= 2$a = $a - 2
*=$a *= 4$a = $a * 4
/=$a /= 2$a = $a / 2
%=$a %= 3$a = $a % 3
.=$a .= "str"$a = $a . "str"(字符串拼接)

六、字符串運算符

僅有兩個運算符,用于字符串操作:

  1. .(連接):

    $str1 = "Hello";
    $str2 = "World";
    echo $str1 . " " . $str2; // "Hello World"
    
  2. .=(連接賦值):

    $str = "Hello";
    $str .= " World"; // $str 變為 "Hello World"
    

七、數組運算符

用于數組比較和合并:

運算符名稱示例說明
+聯合$a + $b合并數組,保留左側鍵名,忽略右側重復鍵
==松散相等[1, 2] == ["1", 2]true鍵值對相同,忽略鍵類型和順序
===嚴格相等[1, 2] === [2, 1]false鍵值對、順序、類型均相同
!=松散不等== 結果相反
!==嚴格不等=== 結果相反

示例

$a = ["a" => 1, "b" => 2];
$b = ["b" => 3, "c" => 4];
print_r($a + $b); // ["a"=>1, "b"=>2, "c"=>4]

八、類型運算符

  1. instanceof
    檢查對象是否屬于某個類或接口:

    class MyClass {}
    $obj = new MyClass();
    var_dump($obj instanceof MyClass); // true
    

九、執行運算符

  1. 反引號 ```
    執行系統命令并返回輸出:

    $output = `ls -al`; // 類似 shell_exec()
    echo $output;
    

十、錯誤控制運算符

  1. @
    抑制表達式可能產生的錯誤:

    $file = @file('non_existent.txt'); // 不顯示錯誤信息
    

    注意:濫用可能導致調試困難,建議使用異常處理替代。


十一、自操作運算符

修改變量值的快捷操作:

運算符名稱示例說明
++$a前遞增$a = 5; echo ++$a; → 6先加1,后返回值
$a++后遞增$a = 5; echo $a++; → 5先返回值,后加1
--$a前遞減$a = 5; echo --$a; → 4先減1,后返回值
$a--后遞減$a = 5; echo $a--; → 5先返回值,后減1
1. 自增和自減運算符

基本概念

  • 自增運算符(++):用于將變量的值增加 1。
  • 自減運算符(–):用于將變量的值減少 1。

這兩種運算符又分為兩種形式:

  • 前置形式
    寫法: ++$var--$var
    特點:先對變量進行加減操作,然后再使用變量的新值。例如:

    php復制編輯<?php
    $a = 5;
    $b = ++$a;  // $a 先自增變為6,再將6賦給 $b
    echo $a; // 輸出 6
    echo $b; // 輸出 6
    ?>
    
  • 后置形式
    寫法: $var++$var--
    特點:先使用變量原來的值,然后再進行加減操作。例如:

    <?php
    $a = 5;
    $b = $a++;  // $b 先接收$a的值5,然后$a自增變為6
    echo $a; // 輸出 6
    echo $b; // 輸出 5
    ?>
    

使用注意

  • 表達式求值順序
    在復雜表達式中混合使用前置和后置運算符時,需要特別注意求值順序,以免造成難以預料的結果。例如,避免在同一表達式中對同一變量進行多次自增或自減操作。
  • 代碼可讀性
    盡量避免過度復雜的自操作運算符嵌套,以保證代碼的可讀性和易于維護。
2. 復合賦值運算符

除了自增自減之外,PHP 還提供了復合賦值運算符,這類運算符結合了運算和賦值操作,常用的有:

  • 加法賦值運算符 +=
    例如:$a += 5; 等價于 $a = $a + 5;
  • 減法賦值運算符 -=
    例如:$a -= 3; 等價于 $a = $a - 3;
  • 乘法賦值運算符 *=
    例如:$a *= 2; 等價于 $a = $a * 2;
  • 除法賦值運算符 /=
    例如:$a /= 4; 等價于 $a = $a / 4;

這類運算符可以減少代碼的冗余,增強代碼的簡潔性。

3. 實際應用場景
  • 循環計數
    自增和自減運算符在循環中非常常見,例如 for 循環:

    <?php
    for ($i = 0; $i < 10; $i++) {echo $i . " ";
    }
    ?>
    
  • 統計計數
    用于統計出現次數、迭代數組或對象時更新計數器。

  • 復合運算
    復合賦值運算符常用于累加、累減、乘積等場景,能讓代碼更加緊湊。


十二、三元運算符

1.基本語法
$result = (條件) ? 表達式1 : 表達式2;
  • 條件:一個布爾表達式。
  • 表達式1:當條件為真(true)時執行或返回的值。
  • 表達式2:當條件為假(false)時執行或返回的值。
<?php
$a = 10;
$b = 20;
$result = ($a > $b) ? "a大于b" : "a不大于b";
echo $result; // 輸出 "a不大于b"
?>

在上面的代碼中,如果 $a > $b 為真,則 $result 將被賦值為 “a大于b”;否則為 “a不大于b”。

2. 嵌套使用

當需要根據多個條件進行判斷時,可以將三元運算符嵌套使用。但要注意,由于三元運算符是右結合(right-associative)的,建議使用括號明確表達順序,避免產生歧義。例如:

<?php
$score = 75;
$result = ($score >= 90) ? "優秀" : (($score >= 60) ? "及格" : "不及格");
echo $result; // 輸出 "及格"
?>

這種寫法先判斷 $score >= 90,如果不滿足,再判斷 $score >= 60,依次返回對應的結果。


3. 簡化寫法:短路求值

PHP 還支持一種簡寫形式,當你想要檢查一個變量是否“真”并直接使用該變量時,可以使用“?:”運算符。其語法為:

$result = $var ?: $default;

這個表達式等同于:

$result = $var ? $var : $default;

$var 的值被認為是真(非空、非零等)時,結果就是 $var;否則返回 $default。例如:

<?php
$username = "";
$displayName = $username ?: "匿名用戶";
echo $displayName; // 輸出 "匿名用戶"
?>

十三、運算符優先級

運算符按優先級從高到低執行,部分常見優先級如下(完整列表見PHP文檔):

  1. clonenew
  2. **
  3. ++--~(int)等類型轉換
  4. !
  5. */%
  6. +-.
  7. <<=>>=
  8. =====!=!==<><=>
  9. &&||andorxor
  10. ?:??
  11. =+=.=等賦值運算符

建議:使用括號明確優先級,避免依賴記憶。


十四、實用技巧與陷阱

  1. 優先級陷阱

    echo 1 + 2 * 3;   // 7(乘法優先級高于加法)
    echo (1 + 2) * 3; // 9
    
  2. 類型轉換問題

    var_dump(0 == "a");     // true(字符串"a"轉為0)
    var_dump("123" == 123); // true(字符串轉數字)
    
  3. 嚴格比較
    使用 ===!== 避免類型轉換導致的意外結果。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 并發編程——BIO NIO AIO 概念

參考 Java 并發編程——BIO NIO AIO 概念 阻塞與非阻塞、同步與異步概念 系統調用、緩存、物理設備阻塞與非阻塞同步與異步 四種主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路復用異步 IO select&#xff0c;poll&#xff0c;epoll 系統調用命令

探索Maas平臺與阿里 QWQ 技術:AI調參的魔法世界

摘要&#xff1a;本文介紹了藍耘 Maas 平臺在人工智能領域的表現及其核心優勢&#xff0c;包括強大的模型支持、高效的資源調度和友好的操作界面。文章還探討了藍耘 Maas 平臺與阿里 QWQ 技術的融合亮點及應用拓展實例&#xff0c;并提供了調參實戰指南&#xff0c;最后對藍耘 …

Python 實現大文件的高并發下載

項目背景 基于一個 scrapy-redis 搭建的分布式系統&#xff0c;所有item都通過重寫 pipeline 存儲到 redis 的 list 中。這里我通過代碼演示如何基于線程池 協程實現對 item 的中文件下載。 Item 結構 目的是為了下載 item 中 attachments 保存的附件內容。 {"crawl_tim…

MySQL與Canal、RabbitMQ集成指南

MySQL 部分 1. 查看是否開啟 binlog MySQL 8 默認開啟 binlog。可以通過以下命令查看是否開啟&#xff1a; SHOW VARIABLES LIKE log_bin;如果返回結果為 ON&#xff0c;則表示 binlog 已開啟。 Variable_nameValuelog_binON 2. 若未開啟 binlog&#xff0c;則需手動配置 …

X86 RouterOS 7.18 設置筆記十:上海電信IPTV使用msd_lite實現組播轉單撥

X86 j4125 4網口小主機折騰筆記五&#xff1a;PVE安裝ROS RouterOS X86 RouterOS 7.18 設置筆記一&#xff1a;基礎設置 X86 RouterOS 7.18 設置筆記二&#xff1a;網絡基礎設置(IPV4) X86 RouterOS 7.18 設置筆記三&#xff1a;防火墻設置(IPV4) X86 RouterOS 7.18 設置筆記四…

Select 選擇器選項位置偏移的解決方案

Select 選擇器選項位置偏移的解決方案 在使用 Select 組件時&#xff0c;可能會遇到下拉選項位置偏移的問題。這通常由 CSS 樣式、組件 渲染方式 或 父級元素的影響 造成。以下是詳細的排查步驟和解決方案。 一、常見原因 position: relative; 或 overflow: hidden; 影響下拉菜…

LeetCode 解題思路 17(Hot 100)

解題思路&#xff1a; 找到鏈表中點&#xff1a; 使用快慢指針法&#xff0c;快指針每次移動兩步&#xff0c;慢指針每次移動一步。當快指針到達末尾時&#xff0c;慢指針指向中點。遞歸分割與排序&#xff1a; 將鏈表從中點處分割為左右兩個子鏈表&#xff0c;分別對這兩個子…

數學建模歷程之初見

第一次接觸數學建模是在上大學前&#xff0c;當時只是聽過。起源于我在大學的老鄉群里聊天&#xff0c;由于當時年輕有點傻&#xff0c;說的話太多了&#xff0c;什么都問哈哈哈哈哈。 后來有個學長從老鄉群里加我&#xff0c;問我怎么話那么多&#xff0c;你們懂當時對我幼小…

Python 科學計算與機器學習入門:NumPy + Scikit-Learn 實戰指南

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

「自動駕駛背后的數學:從傳感器數據到控制指令的函數嵌套」—— 揭秘人工智能中的線性函數、ReLU 與復合函數

引言 自動駕駛技術是人工智能領域的一個重要應用&#xff0c;其核心在于如何將傳感器數據轉化為車輛控制指令。這一過程涉及大量的數學知識&#xff0c;包括線性函數、激活函數&#xff08;如 ReLU&#xff09;以及復合函數的嵌套使用。本文將深入探討自動駕駛中的數學原理&am…

詳解SQL數據定義功能

數據定義 1. 數據庫模式&#xff08;Schema&#xff09;的定義與刪除定義模式刪除模式 2. 基本表的定義、修改與刪除定義表約束1. NOT NULL 約束2. DEFAULT 約束3. UNIQUE 約束4. PRIMARY KEY 約束多列主鍵示例&#xff1a; 5. FOREIGN KEY 約束6. CHECK 約束7. AUTO_INCREMENT…

Redis超高并發分key實現

Redis扛并發的能力是非常強的&#xff0c;所以高并發場景下經常會使用Redis&#xff0c;但是Redis單分片的寫入瓶頸在2w左右&#xff0c;讀瓶頸在10w左右&#xff0c;如果在超高并發下即使是集群部署Redis&#xff0c;單分片的Redis也是有可能扛不住的&#xff0c;如下圖所示&a…

AI Agent 時代開幕-Manus AI與OpenAI Agent SDK掀起新風暴

【本周AI新聞: AI Agent 時代開幕-Manus AI與OpenAI Agent SDK掀起新風暴】 https://www.bilibili.com/video/BV1bkQyYCEvQ/?share_sourcecopy_web&vd_source32ed33e1165d68429b2e2eb4749f3f26 最近AI圈子里最火的話題非Manus莫屬&#xff01;這款由中國武漢創業公司“蝴…

多時間尺度的配電網深度強化學習無功優化策略的Python示例代碼框架

以下是一個簡單的多時間尺度的配電網深度強化學習無功優化策略的Python示例代碼框架&#xff0c;用于幫助你理解如何使用深度強化學習&#xff08;以深度Q網絡 DQN 為例&#xff09;來處理配電網的無功優化問題。在實際應用中&#xff0c;你可能需要根據具體的配電網模型和需求…

劍指 Offer II 081. 允許重復選擇元素的組合

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20081.%20%E5%85%81%E8%AE%B8%E9%87%8D%E5%A4%8D%E9%80%89%E6%8B%A9%E5%85%83%E7%B4%A0%E7%9A%84%E7%BB%84%E5%90%88/README.md 劍指 Offer II 081. 允許重復選擇…

Webpack 前端性能優化全攻略

文章目錄 1. 性能優化全景圖1.1 優化維度概覽1.2 優化效果指標 2. 構建速度優化2.1 緩存策略2.2 并行處理2.3 減少構建范圍 3. 輸出質量優化3.1 代碼分割3.2 Tree Shaking3.3 壓縮優化 4. 運行時性能優化4.1 懶加載4.2 預加載4.3 資源優化 5. 高級優化策略5.1 持久化緩存5.2 模…

虛擬電商-數據庫分庫分表(二)

本文章介紹&#xff1a;使用Sharding-JDBC實現數據庫分庫分表&#xff0c;數據庫分片策略&#xff0c;實現數據庫按月分表 一、Sharding-JDBC使用 1.1.準備環境 步驟一&#xff1a;分庫分表sql腳本導入 創建了兩個數據庫&#xff1a;chongba_schedule0 和chongba_schedule1…

向量數據庫對比以及Chroma操作

一、向量數據庫與傳統類型數據庫 向量數據庫&#xff08;Vector Storage Engine&#xff09;與傳統類型的數據庫如關系型數據庫&#xff08;MySQL&#xff09;、文檔型數據庫&#xff08;MongoDB&#xff09;、鍵值存儲&#xff08;Redis&#xff09;、全文搜索引擎&#xff0…

python列表基礎知識

列表 創建列表 1.列表的定義&#xff1a;可變的&#xff0c;有序的數據結構&#xff0c;可以隨時添加或者刪除其中的元素 2.基本語法&#xff1a;字面量【元素1&#xff0c;元素2&#xff0c;元素3】使用[]創建列表 定義變量&#xff1a;變量名稱【元素1&#xff0c;元素2&…

Node.js 的模塊作用域和 module 對象詳細介紹

目錄 代碼示例 1. 創建模塊文件 module-demo.js 2. 導入模塊并使用 module-demo.js 運行結果 總結 在 Node.js 中&#xff0c;每個文件都是一個獨立的模塊&#xff0c;具有自己的作用域。與瀏覽器 JavaScript 代碼不同&#xff0c;Node.js 采用模塊作用域&#xff0c;這意味…