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(字符串转数字) -  
严格比较:
使用===和!==避免类型转换导致的意外结果。