PHP 变量与数据类型

变量是编程中最基础的概念,用于存储和操作数据。PHP 是一种弱类型语言,这意味着你不需要在声明变量时指定数据类型,PHP 会根据赋值自动判断类型。这种灵活性让 PHP 非常易于上手,但也需要开发者对类型转换保持警惕。

变量的声明与命名规则

PHP 变量以美元符号 $ 开头,后跟变量名。变量名必须以字母或下划线开头,不能以数字开头,且区分大小写。

PHP 实例
$name = "张三";       // 字符串
$age  = 25;           // 整数
$price = 9.99;        // 浮点数
$isActive = true;     // 布尔值
$nothing = null;      // 空值

// 注意:PHP 变量名区分大小写 $Name = "李四"; // 这是另一个变量,与 $name 不同 ``

良好的变量命名习惯非常重要。推荐使用小驼峰命名法$userName)或下划线命名法$user_name),保持整个项目风格统一。

PHP 的 8 种数据类型

PHP 支持 8 种原始数据类型,分为三大类:

标量类型(4种):存储单一值

  • string(字符串)
  • integer(整数)
  • float(浮点数)
  • boolean(布尔值)
复合类型(2种):存储多个值
  • array(数组)
  • object(对象)
特殊类型(2种)
  • null(空值)
  • resource(资源,如数据库连接)

字符串(String)

字符串是最常用的数据类型,用于存储文本内容。PHP 中有四种定义字符串的方式:

`php // 单引号:不解析变量,性能略高 $str1 = '这是单引号字符串,$name 不会被解析';

// 双引号:解析变量和转义字符 $name = "张三"; $str2 = "你好,$name!今天天气不错。"; // 你好,张三!今天天气不错。

// Heredoc:适合多行字符串,解析变量 $html = <<<EOT <div class="user"> <p>姓名:$name</p> </div> EOT;

// Nowdoc:类似单引号,不解析变量 $template = <<<'EOT' 变量 $name 在这里不会被解析 EOT; `

整数(Integer)

整数可以用十进制、十六进制、八进制或二进制表示:

`php $decimal = 255; // 十进制 $hex = 0xFF; // 十六进制(255) $octal = 0377; // 八进制(255) $binary = 0b11111111; // 二进制(255)

// PHP 7.4+ 支持数字分隔符,提高可读性 $million = 1_000_000; $pi = 3.141_592_653; `

浮点数(Float)

浮点数用于存储小数,需要注意浮点数的精度问题:

`php $price = 9.99; $pi = 3.14159; $sci = 1.5e3; // 科学计数法,等于 1500

// 浮点数精度陷阱! var_dump(0.1 + 0.2 == 0.3); // false! echo 0.1 + 0.2; // 0.30000000000000004

// 正确的比较方式 echo abs(0.1 + 0.2 - 0.3) < PHP_FLOAT_EPSILON ? 'true' : 'false'; // true `

布尔值(Boolean)

布尔值只有 truefalse 两个值,常用于条件判断:

`php $isLoggedIn = true; $hasError = false;

// 以下值在布尔上下文中被视为 false(假值) // false, 0, 0.0, "", "0", [], null var_dump((bool)""); // false var_dump((bool)"0"); // false var_dump((bool)"false"); // true!非空字符串都是 true `

变量作用域

PHP 有三种变量作用域,理解作用域是避免 bug 的关键:

`php $globalVar = "我是全局变量";

function testScope() { // 函数内部无法直接访问全局变量 echo $globalVar; // 报错:未定义变量

// 需要用 global 关键字声明 global $globalVar; echo $globalVar; // 正常输出 }

function testStatic() { static $count = 0; // 静态变量:函数调用结束后值保留 $count++; echo $count; }

testStatic(); // 1 testStatic(); // 2 testStatic(); // 3 `

类型检测与转换

PHP 提供了丰富的类型检测函数:

`php $value = "42";

// 检测类型 echo gettype($value); // string var_dump(is_string($value)); // true var_dump(is_int($value)); // false var_dump(is_numeric($value)); // true(字符串内容是数字)

// 强制类型转换 $int = (int)"42abc"; // 42(取前面的数字部分) $float = (float)"3.14"; // 3.14 $str = (string)100; // "100" $bool = (bool)0; // false $arr = (array)"hello"; // ["hello"]

// settype() 直接修改变量类型 $var = "3.14"; settype($var, "float"); var_dump($var); // float(3.14) `

可变变量

PHP 支持可变变量,即变量名可以动态指定:

`php $varName = "hello"; $$varName = "World"; // 等同于 $hello = "World"

echo $hello; // World echo $$varName; // World

常见问题

Q:PHP 变量不需要声明就能使用吗? A:PHP 变量在赋值时自动创建,不需要提前声明。但直接使用未赋值的变量会产生 Notice 警告,建议养成先赋值再使用的习惯,或使用 isset() 检查变量是否存在。

Q:单引号和双引号字符串有什么区别? A:单引号字符串不解析变量和大多数转义字符(只支持 \\\'),性能略高;双引号字符串会解析 $variable 变量和 \n\t 等转义字符。在不需要解析变量时,优先使用单引号。

Q:PHP 中 null 和 false 有什么区别? A:null 表示变量没有值,false 是布尔类型的假值。null == falsetrue,但 null === falsefalseisset($var)null 返回 false,而对 false 返回 true

Q:为什么 0.1 + 0.2 不等于 0.3? A:这是浮点数的精度问题,不是 PHP 的 bug,所有编程语言都存在这个问题。浮点数在计算机中以二进制存储,某些十进制小数无法精确表示。比较浮点数时应使用误差范围判断,或使用 bcmath` 扩展进行精确计算。