<返回目录     Powered by claud/xia兄

第2课: 变量、常量与数据类型

PHP变量基础

PHP是一种弱类型语言,变量不需要声明类型,PHP会根据值自动确定类型。理解变量的概念是学习编程的基础。

什么是变量?

变量是程序中存储数据的容器,可以理解为内存中的一个命名空间。在PHP中,变量具有以下特点:

变量的生命周期

理解变量的生命周期对于编写高效的PHP代码非常重要:

变量生命周期阶段:
  1. 声明:首次使用变量时,PHP自动为其分配内存
  2. 赋值:为变量赋予具体的值
  3. 使用:在程序中使用变量的值
  4. 销毁:脚本执行结束或使用unset()函数销毁变量

变量命名规则

<?php
// 变量以$符号开头
$name = "张三";
$age = 25;
$_private = "私有变量";
$userName123 = "用户名";

// 错误的命名
// $123name = "错误";  // 不能以数字开头
// $user-name = "错误";  // 不能包含连字符
// $user name = "错误";  // 不能包含空格
?>
变量命名最佳实践:

PHP数据类型

PHP支持8种原始数据类型:

1. 字符串(String)

<?php
// 单引号字符串(不解析变量)
$str1 = 'Hello World';
$name = 'PHP';
echo 'Hello $name';  // 输出:Hello $name

// 双引号字符串(解析变量)
$str2 = "Hello World";
echo "Hello $name";  // 输出:Hello PHP

// 字符串连接
$fullName = "张" . "三";  // 使用点号连接
echo "姓名:{$fullName}";  // 花括号包裹变量

// Heredoc语法(多行字符串)
$html = <<<HTML
<div>
    <h1>标题</h1>
    <p>内容:$name</p>
</div>
HTML;

// Nowdoc语法(不解析变量)
$text = <<<'TEXT'
这是原始文本
$name 不会被解析
TEXT;
?>

2. 整数(Integer)

<?php
$decimal = 123;        // 十进制
$octal = 0123;         // 八进制(以0开头)
$hex = 0x1A;           // 十六进制(以0x开头)
$binary = 0b1010;      // 二进制(以0b开头)

// 整数范围
echo PHP_INT_MAX;      // 最大整数值
echo PHP_INT_MIN;      // 最小整数值
echo PHP_INT_SIZE;     // 整数字节数

// 类型检查
var_dump(is_int(123));      // bool(true)
var_dump(is_integer(123));  // bool(true)
?>

3. 浮点数(Float/Double)

<?php
$float1 = 3.14;
$float2 = 2.5e3;       // 科学计数法:2.5 × 10³ = 2500
$float3 = 7E-10;       // 0.0000000007

// 浮点数精度问题
$a = 0.1 + 0.2;
var_dump($a == 0.3);   // bool(false) - 浮点数精度问题

// 正确的比较方式
$epsilon = 0.00001;
var_dump(abs($a - 0.3) < $epsilon);  // bool(true)

// 类型检查
var_dump(is_float(3.14));   // bool(true)
var_dump(is_double(3.14));  // bool(true)
?>

4. 布尔值(Boolean)

<?php
$isTrue = true;
$isFalse = false;

// 以下值被视为false
var_dump((bool)0);          // false
var_dump((bool)0.0);        // false
var_dump((bool)"");         // false
var_dump((bool)"0");        // false
var_dump((bool)null);       // false
var_dump((bool)[]);         // false(空数组)

// 其他值都为true
var_dump((bool)1);          // true
var_dump((bool)-1);         // true
var_dump((bool)"false");    // true(非空字符串)
var_dump((bool)[0]);        // true(非空数组)
?>

5. 数组(Array)

<?php
// 索引数组
$colors = ["红色", "绿色", "蓝色"];
$numbers = array(1, 2, 3, 4, 5);

// 关联数组
$person = [
    "name" => "张三",
    "age" => 25,
    "city" => "北京"
];

// 多维数组
$users = [
    ["name" => "张三", "age" => 25],
    ["name" => "李四", "age" => 30]
];

// 访问数组元素
echo $colors[0];           // 红色
echo $person["name"];      // 张三
echo $users[0]["age"];     // 25
?>

6. 对象(Object)

<?php
class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function sayHello() {
        return "你好,我是{$this->name}";
    }
}

$person = new Person("张三", 25);
echo $person->name;         // 张三
echo $person->sayHello();   // 你好,我是张三
?>

7. NULL类型

<?php
$var1 = null;              // 显式赋值为null
$var2;                     // 未初始化的变量
unset($var3);              // 被unset的变量

// 检查null
var_dump(is_null($var1));  // bool(true)
var_dump(isset($var1));    // bool(false)
var_dump(empty($var1));    // bool(true)

// null合并运算符(PHP 7+)
$username = $_GET['user'] ?? 'guest';  // 如果不存在则使用默认值
?>

8. 资源(Resource)

<?php
// 文件资源
$file = fopen("test.txt", "r");
var_dump(is_resource($file));  // bool(true)
fclose($file);

// 数据库连接资源
$conn = mysqli_connect("localhost", "user", "pass", "db");
var_dump(get_resource_type($conn));  // mysql link
mysqli_close($conn);
?>

类型转换

自动类型转换

<?php
// PHP会自动进行类型转换
$result = "10" + 5;        // int(15) - 字符串转为整数
$result = "10.5" + 2;      // float(12.5)
$result = "10 apples" + 5; // int(15) - 提取数字部分
$result = "hello" + 5;     // int(5) - 无法转换则为0
?>

强制类型转换

<?php
$str = "123";

// 方式1:使用类型转换运算符
$int = (int)$str;
$float = (float)$str;
$bool = (bool)$str;
$array = (array)$str;

// 方式2:使用转换函数
$int = intval($str);
$float = floatval($str);
$str = strval(123);

// 方式3:使用settype函数
$var = "123";
settype($var, "integer");
var_dump($var);  // int(123)
?>

类型检查函数

<?php
$var = "Hello";

// 检查具体类型
is_string($var);    // 是否为字符串
is_int($var);       // 是否为整数
is_float($var);     // 是否为浮点数
is_bool($var);      // 是否为布尔值
is_array($var);     // 是否为数组
is_object($var);    // 是否为对象
is_null($var);      // 是否为null
is_resource($var);  // 是否为资源

// 检查数值类型
is_numeric("123");  // true - 是否为数字或数字字符串
is_scalar($var);    // true - 是否为标量(int/float/string/bool)

// 获取类型
gettype($var);      // 返回类型名称字符串
get_debug_type($var); // PHP 8+ 更详细的类型信息
?>

变量作用域

局部作用域

<?php
function test() {
    $local = "局部变量";
    echo $local;  // 正常访问
}

test();
// echo $local;  // 错误:未定义变量
?>

全局作用域

<?php
$global = "全局变量";

function test() {
    global $global;  // 声明使用全局变量
    echo $global;

    // 或使用$GLOBALS数组
    echo $GLOBALS['global'];
}

test();
?>

静态变量

<?php
function counter() {
    static $count = 0;  // 静态变量保持值
    $count++;
    echo $count . "\n";
}

counter();  // 输出:1
counter();  // 输出:2
counter();  // 输出:3
?>

常量定义

<?php
// 使用define()定义常量
define("SITE_NAME", "我的网站");
define("MAX_SIZE", 100);
define("PI", 3.14159);

echo SITE_NAME;  // 我的网站

// 使用const关键字(类内部或顶级作用域)
const APP_VERSION = "1.0.0";
const DEBUG = true;

// 魔术常量
echo __FILE__;      // 当前文件的完整路径
echo __DIR__;       // 当前文件所在目录
echo __LINE__;      // 当前行号
echo __FUNCTION__;  // 当前函数名
echo __CLASS__;     // 当前类名
echo __METHOD__;    // 当前方法名
?>

可变变量

<?php
$var = "hello";
$$var = "world";  // 创建变量$hello

echo $hello;      // 输出:world
echo $$var;       // 输出:world

// 实际应用
$field = "username";
$$field = "张三";
echo $username;   // 输出:张三
?>
注意事项:

实践练习

  1. 变量声明:创建不同类型的变量并使用var_dump()查看类型
  2. 字符串操作:使用单引号和双引号创建字符串,观察变量解析的区别
  3. 数组练习:创建一个学生信息数组,包含姓名、年龄、成绩等信息
  4. 类型转换:将字符串"123.45"分别转换为整数和浮点数
  5. 布尔判断:测试不同值转换为布尔值的结果
  6. 常量使用:定义网站配置常量(如网站名称、版本号等)
  7. 作用域测试:创建函数测试局部变量和全局变量的访问
  8. 静态变量:编写一个函数,使用静态变量统计函数被调用的次数