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; | true 或false |
數組(array) | $colors = ["red", "blue"]; | 有序鍵值對集合 |
對象(object) | $user = new User(); | 類的實例化 |
NULL | $data = null; | 表示變量無值 |
資源(resource) | $file = fopen("a.txt"); | 外部資源句柄(如文件、數據庫連接) |
2. 變量作用域
作用域分類
-
局部變量:
在函數內部聲明,僅函數內有效。function test() {$localVar = "Inside function"; // 局部變量echo $localVar; } test(); // 輸出 "Inside function" echo $localVar; // 報錯:未定義變量
-
全局變量:
在函數外部聲明,需通過global
關鍵字或$GLOBALS
數組訪問。$globalVar = "Outside function"; function readGlobal() {global $globalVar;echo $globalVar; // 輸出 "Outside function" }
-
靜態變量:
使用static
關鍵字,函數多次調用時保留值。function counter() {static $count = 0;$count++;echo $count; } counter(); // 1 counter(); // 2
-
超全局變量:
預定義全局數組,跨作用域直接訪問,如:$_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. 安全性注意事項
-
未初始化變量:
直接使用未賦值變量會觸發E_WARNING
,建議初始化:// 錯誤示例 echo $undefinedVar; // 警告:Undefined variable // 正確做法 $undefinedVar = isset($undefinedVar) ? $undefinedVar : "default";
-
用戶輸入過濾:
對$_GET
、$_POST
等輸入進行過濾,避免安全漏洞:$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
-
避免直接輸出用戶數據:
防止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
)。
- 不要使用PHP保留關鍵字(如
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位系統為9223372036854775807 ) | 9223372036854775807 |
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 | 布爾與空值常量 | 布爾值true 、false 和空值null | true , false , null |
SORT_ASC /SORT_DESC | 數組排序常量 | 數組升序(SORT_ASC )或降序(SORT_DESC ) | 4 (升序), 3 (降序) |
其他常用常量 | |||
JSON_ERROR_NONE | JSON處理常量 | JSON解析無錯誤 | 0 |
ENT_QUOTES | HTML轉義常量 | 轉義單引號和雙引號(用于htmlspecialchars ) | ENT_QUOTES 的值為 3 |
使用場景示例
-
調試時獲取上下文信息:
echo "當前文件:" . __FILE__ . ",第" . __LINE__ . "行"; // 輸出:當前文件:/app/index.php,第30行
-
動態加載文件:
require __DIR__ . '/config/database.php';
-
錯誤報告配置:
error_reporting(E_ALL); // 報告所有錯誤
-
跨平臺路徑處理:
$file = 'data' . DIRECTORY_SEPARATOR . 'logs.txt';
擴展說明
- 魔術常量:以雙下劃線開頭和結尾,值隨上下文變化(如所在文件、行號等)。
- 環境常量:反映PHP配置和運行環境,常用于編寫跨平臺兼容代碼。
- 錯誤級別常量:通過位掩碼組合使用(如
error_reporting(E_ERROR | E_WARNING)
)。
6. 常量的使用場景
-
配置參數:
存儲數據庫連接信息、API密鑰等。define("DB_HOST", "localhost"); define("DB_USER", "root"); define("DB_PASS", "secret");
-
狀態標識:
定義應用狀態(如開發、生產模式)。const ENV_MODE = "development";
-
避免魔法數值:
用常量替代代碼中的字面量,提升可讀性。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. 注意事項與最佳實踐
-
不可重復定義:
重復定義常量會導致PHP Warning
。define("SITE_NAME", "OldSite"); define("SITE_NAME", "NewSite"); // 觸發警告
-
數組常量(PHP7+):
使用define()
定義數組常量:define("COLORS", ["red", "green", "blue"]); echo COLORS[0]; // 輸出 "red"
-
類常量:
在類中定義常量,支持可見性修飾符(PHP7.1+):class User {public const ROLE_ADMIN = "admin";private const MAX_AGE = 120; } echo User::ROLE_ADMIN; // 輸出 "admin"
-
性能優化:
常量在編譯時解析,訪問速度略快于全局變量。
總結
操作 | 代碼示例 |
---|---|
定義常量(define() ) | define("API_URL", "https://api.example.com"); |
定義常量(const ) | const TIMEOUT = 30; |
訪問常量 | echo API_URL; |
檢測常量 | if (defined("TIMEOUT")) { ... } |
核心原則:
- 優先使用
const
(除非需要動態定義)。 - 通過常量集中管理全局不可變值,增強代碼可維護性。
- 遵循命名規范,避免與系統常量沖突。
三,數據類型分類
PHP的數據類型可以分為標量類型、復合類型、特殊類型以及偽類型。以下是詳細分類和說明:
一、標量類型(Scalar Types)
-
整型(Integer)
- 表示整數,帶符號(支持正負),取值范圍依賴于平臺(32位或64位)。
- 可用進制:十進制(
123
)、十六進制(0x1A
)、八進制(0123
)、二進制(0b1110
)。 - 示例:
$a = 42;
- 類型檢測:
is_int()
或is_integer()
。
-
浮點型(Float/Double)
- 表示小數或科學計數法數值(如
1.2e3
)。 - 精度問題:浮點數計算可能存在精度丟失(如
0.1 + 0.2 != 0.3
)。 - 示例:
$b = 3.14;
- 類型檢測:
is_float()
。
- 表示小數或科學計數法數值(如
-
字符串(String)
-
表示文本,支持單引號(不解析變量)、雙引號(解析變量和轉義字符)、Heredoc和Nowdoc語法。
-
示例:
$str1 = 'Hello'; $str2 = "World: $str1"; $str3 = <<<EOD Multiline EOD;
-
類型檢測:
is_string()
。
-
-
布爾型(Boolean)
- 僅兩個值:
true
和false
(不區分大小寫,如TRUE
也有效)。 - 轉換為
false
的情況:空字符串、0
、null
、空數組等。 - 示例:
$flag = true;
- 類型檢測:
is_bool()
。
- 僅兩個值:
二、復合類型(Compound Types)
-
數組(Array)
-
有序鍵值對集合,鍵可以是整型或字符串,值可為任意類型。
-
示例:
$arr = [1 => "a", "name" => "PHP"];
-
類型檢測:
is_array()
。
-
-
對象(Object)
-
類的實例,包含屬性和方法。
-
示例:
class MyClass {} $obj = new MyClass();
-
類型檢測:
is_object()
。
-
-
可調用(Callable)
-
表示可調用的結構,如函數、方法、閉包或實現
__invoke()
的對象。 -
示例:
$callable = function() { echo "Hello"; };
-
類型檢測:
is_callable()
。
-
-
可迭代(Iterable)
-
PHP 7.1+ 引入,可以是數組或實現
Traversable
接口的對象(如生成器)。 -
示例:
function gen(): iterable { yield 1; }
-
類型檢測:
is_iterable()
。
-
三、特殊類型(Special Types)
- 空值(Null)
- 唯一值
null
,表示變量未賦值或已銷毀(unset()
)。 - 示例:
$var = null;
- 類型檢測:
is_null()
。
- 唯一值
- 資源(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" 被轉換為浮點數)
轉換規則:
-
字符串 → 數字
- 只要字符串以數字開頭,PHP 就會轉換它。
- 遇到非數字字符時,轉換會停止。
echo (int)"123abc"; // 輸出 123 echo (int)"abc123"; // 輸出 0(無效轉換)
-
布爾值轉換
false
轉換為0
,true
轉換為1
echo true + 1; // 輸出 2 echo false + 1; // 輸出 1
-
空字符串、
NULL
轉換- 空字符串
""
和NULL
轉換為0
。
echo (int)NULL; // 0 echo (int)""; // 0
- 空字符串
-
數組轉換
- 數組轉換為整數時,始終返回
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. 類型轉換注意事項
-
字符串轉換為數字時,非數字部分被忽略
echo (int)"10abc"; // 10
-
浮點數轉換為整數時會截斷
echo (int)3.99; // 3
-
布爾值轉換
- 空數組、空字符串、
NULL
、0
轉換為false
,其余為true
echo (bool)""; // false echo (bool)"0"; // false echo (bool)"abc"; // true
- 空數組、空字符串、
-
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 Math
或GMP
擴展處理精確計算(如財務數據)。
示例代碼
// 浮點數定義與精度問題
$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
(邏輯假)
布爾型通常用于條件判斷(如 if
、while
語句)中控制程序流程。¥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; // 輸出 "結果為:"
七、最佳實踐
-
顯式比較
避免依賴隱式轉換,使用嚴格比較(===
):if ($value === true) {// 明確檢查布爾值 }
-
處理表單/外部輸入
從表單或數據庫獲取的數據需顯式轉換:$isActive = (bool)$_POST['is_active'];
-
高可讀性代碼
避免直接使用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+)
注意:除法 /
總是返回浮點數(除非能整除)。
二、比較運算符
用于值比較,返回布爾值 true
或 false
:
運算符 | 名稱 | 示例 | 說明 |
---|---|---|---|
== | 松散等于 | 5 == "5" → true | 值相等,忽略類型 |
=== | 嚴格等于 | 5 === "5" → false | 值和類型均相等 |
!= | 松散不等于 | 5 != "5" → false | 值不相等 |
<> | 松散不等于 | 同 != | |
!== | 嚴格不等于 | 5 !== "5" → true | 值或類型不同 |
< | 小于 | 3 < 5 → true | |
> | 大于 | 3 > 5 → false | |
<= | 小于等于 | 5 <= 5 → true | |
>= | 大于等于 | 5 >= 3 → true | |
<=> | 太空船運算符 | 5 <=> 3 → 1 | PHP7+,返回-1 ,0 ,1 表示比較結果 |
三、邏輯運算符
用于組合條件,支持短路求值:
運算符 | 名稱 | 示例 | 說明 |
---|---|---|---|
&& | 邏輯與 | $a && $b | 兩者為真則真,優先級高于 and |
| | 邏輯或 | $a || $b | 任一為真則真,優先級高于 or |
! | 邏輯非 | !$a | 取反 |
and | 邏輯與 | $a and $b | 功能同 && ,但優先級更低 |
or | 邏輯或 | $a or $b | 功能同 || ,優先級更低 |
xor | 邏輯異或 | $a xor $b | 僅一真則真,否則假 |
注意:
-
&&
和||
優先級高于and
和or
,可能導致邏輯錯誤:$result = false && true; // → false(等價于 (false) && true) $result = false and true; // → false(等價于 ($result = false) and true)
-
短路求值:若左操作數已確定結果,右操作數不執行:
false && expensiveFunction(); // 不會調用函數
四、位運算符
對整數的二進制位進行操作:
運算符 | 名稱 | 示例 | 說明 |
---|---|---|---|
& | 按位與 | 5 & 3 → 1 | 二進制位同為1則結果位為1 |
| | 按位或 | 5 | 3 → 7 | 任一二進制位為1則結果位為1 |
^ | 按位異或 | 5 ^ 3 → 6 | 二進制位不同則結果位為1 |
~ | 按位取反 | ~5 → -6 | 0變1,1變0(結果依賴整數位數) |
<< | 左移 | 5 << 1 → 10 | 左移指定位數,右側補0 |
>> | 右移 | 5 >> 1 → 2 | 右移指定位數,左側補符號位 |
應用場景:權限控制、標志位處理。
計算機碼的基本概念
計算機存儲數據時通常采用 定長二進制,尤其是整數。負數的表示方式一般有三種主要編碼方式:
-
原碼(Sign-Magnitude Representation)
- 最高位(最左側)作為符號位:
0
表示正數,1
表示負數。 - 剩余部分表示數值的絕對值。
- 缺點:正負零的表示不同,且計算復雜。
示例(8位存儲):
+5
→00000101
-5
→10000101
- 最高位(最左側)作為符號位:
-
反碼(One’s Complement)
- 正數的表示與原碼相同。
- 負數的表示是對原碼的數值部分按位取反(0 變 1,1 變 0)。
- 存在兩個零 (
+0
和-0
),仍然不便于計算。
示例(8位存儲):
+5
→00000101
-5
→11111010
(取反)
-
補碼(Two’s Complement,計算機中最常用的表示方式)
- 正數的表示與原碼相同。
- 負數的表示是反碼 + 1(取反后加 1)。
- 補碼的優點:
- 計算更方便(加減法可直接使用二進制加法)。
- 只有一種零表示方式 (
00000000
)。
示例(8位存儲):
+5
→00000101
-5
→11111011
(先取反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" (字符串拼接) |
六、字符串運算符
僅有兩個運算符,用于字符串操作:
-
.
(連接):$str1 = "Hello"; $str2 = "World"; echo $str1 . " " . $str2; // "Hello World"
-
.=
(連接賦值):$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]
八、類型運算符
-
instanceof
檢查對象是否屬于某個類或接口:class MyClass {} $obj = new MyClass(); var_dump($obj instanceof MyClass); // true
九、執行運算符
-
反引號 ```
執行系統命令并返回輸出:$output = `ls -al`; // 類似 shell_exec() echo $output;
十、錯誤控制運算符
-
@
抑制表達式可能產生的錯誤:$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文檔):
clone
、new
**
++
、--
、~
、(int)
等類型轉換!
*
、/
、%
+
、-
、.
<
、<=
、>
、>=
==
、===
、!=
、!==
、<>
、<=>
&&
、||
、and
、or
、xor
?:
、??
=
、+=
、.=
等賦值運算符
建議:使用括號明確優先級,避免依賴記憶。
十四、實用技巧與陷阱
-
優先級陷阱:
echo 1 + 2 * 3; // 7(乘法優先級高于加法) echo (1 + 2) * 3; // 9
-
類型轉換問題:
var_dump(0 == "a"); // true(字符串"a"轉為0) var_dump("123" == 123); // true(字符串轉數字)
-
嚴格比較:
使用===
和!==
避免類型轉換導致的意外結果。