变量与常量

学习PHP变量的声明、使用和常量定义

PHP变量概述

变量是用于存储信息的"容器",PHP变量名称对大小写敏感。

变量特点: PHP变量以$符号开头,后面跟着变量名称,不需要事先声明类型。

变量的重要性

变量是编程语言的基础,用于存储和操作数据。在PHP中,变量是动态类型的,意味着同一个变量可以在不同时间存储不同类型的值。

变量与内存

当创建变量时,PHP会在内存中分配空间来存储变量的值。变量名实际上是对内存位置的引用。

变量命名规则

PHP变量命名必须遵循以下规则:

  • 变量以$符号开头,后面跟着变量名
  • 变量名必须以字母或下划线开头
  • 变量名只能包含字母、数字和下划线(A-z、0-9 和 _)
  • 变量名不能包含空格
  • 变量名对大小写敏感($age$AGE 是两个不同的变量)
变量命名示例
<?php
// 有效的变量名
$name = "张三";
$_age = 25;
$firstName = "李";
$first_name = "李";
$user1 = "用户1";

// 无效的变量名
// $1user = "用户";  // 不能以数字开头
// $user-name = "用户";  // 不能包含连字符
// $user name = "用户";  // 不能包含空格
?>

命名约定

虽然PHP对变量命名规则比较宽松,但遵循一致的命名约定可以提高代码的可读性:

  • 驼峰命名法: $firstName, $lastName
  • 蛇形命名法: $first_name, $last_name
  • 常量命名: 通常使用全大写,单词间用下划线分隔
最佳实践: 选择一种命名约定并在整个项目中保持一致。对于团队项目,应遵循团队的编码规范。

变量声明和赋值

在PHP中,变量在第一次赋值时被创建。

变量声明和赋值
<?php
// 声明变量并赋值
$name = "王五";
$age = 30;
$height = 175.5;
$isStudent = true;

// 输出变量
echo "姓名: " . $name . "<br>";
echo "年龄: " . $age . "<br>";
echo "身高: " . $height . "<br>";
echo "是否是学生: " . ($isStudent ? "是" : "否") . "<br>";

// 重新赋值
$age = 31;
echo "更新后的年龄: " . $age;
?>

变量引用

PHP支持变量引用,允许两个变量指向同一个数据。

变量引用示例
<?php
$a = 5;
$b = &$a;  // $b 是 $a 的引用

echo "a = $a, b = $b<br>";  // 输出: a = 5, b = 5

$b = 10;
echo "a = $a, b = $b<br>";  // 输出: a = 10, b = 10

// 取消引用
unset($b);
echo "a = $a<br>";  // 输出: a = 10
?>

变量作用域

变量的作用域是脚本中变量可被引用/使用的部分。PHP有四种不同的变量作用域:

1. local(局部)

在函数内部声明的变量拥有局部作用域,只能在函数内部访问。

局部变量示例
<?php
$globalVar = "全局变量";  // 全局变量

function testFunction() {
    $localVar = "局部变量";  // 局部变量
    echo $localVar;  // 可以访问
    // echo $globalVar;  // 错误!不能访问全局变量
}

testFunction();
// echo $localVar;  // 错误!不能访问局部变量
echo $globalVar;  // 可以访问
?>

2. global(全局)

在函数外部声明的变量拥有全局作用域,只能在函数外部访问。

全局变量示例
<?php
$x = 5;  // 全局变量

function myTest() {
    // 使用 global 关键字在函数内部访问全局变量
    global $x;
    echo "函数内部: " . $x . "<br>";
    
    // 或者使用 $GLOBALS 数组
    echo "使用GLOBALS: " . $GLOBALS['x'] . "<br>";
}

myTest();
echo "函数外部: " . $x;
?>

3. static(静态)

当函数完成/执行后,会删除所有局部变量。如果希望某个局部变量不被删除,可以使用static关键字。

静态变量示例
<?php
function myTest() {
    static $x = 0;
    echo $x . "<br>";
    $x++;
}

myTest();  // 输出 0
myTest();  // 输出 1
myTest();  // 输出 2
?>

4. parameter(参数)

参数是通过调用代码将值传递给函数的局部变量。

参数示例
<?php
function myTest($param) {
    echo "参数值是: " . $param;
}

myTest("Hello");  // 输出 "参数值是: Hello"
?>

超全局变量

PHP提供了多个超全局变量,它们在所有作用域中始终可用:

超全局变量示例
<?php
// $GLOBALS - 引用全局作用域中可用的全部变量
$x = 75; 
$y = 25;
 
function addition() { 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}

addition();
echo $z;  // 输出 100

// 其他常用超全局变量
// $_SERVER - 服务器和执行环境信息
// $_REQUEST - HTTP请求变量
// $_POST - HTTP POST变量
// $_GET - HTTP GET变量
// $_FILES - HTTP文件上传变量
// $_SESSION - Session变量
// $_COOKIE - HTTP Cookies
?>

可变变量

可变变量是一种特殊的变量,它的变量名可以动态地设置和使用。

可变变量示例
<?php
$name = "user";
$$name = "张三";  // 相当于 $user = "张三"

echo $user;  // 输出 "张三"
echo $$name;  // 输出 "张三"

// 更复杂的例子
$a = 'hello';
$$a = 'world';  // 相当于 $hello = 'world'

echo "$a ${$a}";  // 输出 "hello world"
echo "$a $hello";  // 输出 "hello world"
?>

可变变量的应用场景

可变变量在某些情况下非常有用,例如动态创建变量名或处理配置数据。

可变变量应用示例
<?php
// 动态创建配置变量
$config = [
    'db_host' => 'localhost',
    'db_user' => 'root',
    'db_pass' => 'password'
];

foreach ($config as $key => $value) {
    $$key = $value;
}

echo "数据库主机: $db_host<br>";
echo "数据库用户: $db_user<br>";

// 动态调用函数
$functionName = 'sayHello';

function sayHello() {
    echo "Hello World!<br>";
}

$functionName();  // 调用 sayHello 函数
?>

PHP常量

常量是一个简单值的标识符,在脚本执行期间该值不能改变。常量默认全局有效。

定义常量

使用 define() 函数定义常量:

常量定义
<?php
// 定义常量
define("SITE_NAME", "当发网");
define("VERSION", "1.0");
define("MAX_USERS", 100);
define("IS_ACTIVE", true);

// 使用常量
echo SITE_NAME . "<br>";
echo "版本: " . VERSION . "<br>";
echo "最大用户数: " . MAX_USERS . "<br>";
echo "是否激活: " . (IS_ACTIVE ? "是" : "否");

// 尝试修改常量(会导致错误)
// SITE_NAME = "新名称";  // 错误!
?>

const关键字

PHP 5.3以后,可以使用const关键字在类定义之外定义常量。

const定义常量
<?php
// 使用const定义常量
const DB_HOST = "localhost";
const DB_USER = "root";
const DB_PASS = "password";

echo "数据库主机: " . DB_HOST;
?>
define() vs const:
  • define()可以在任何地方定义常量,包括条件语句中
  • const必须在最外层作用域定义,不能在条件语句中使用
  • const总是大小写敏感的,而define()可以通过第三个参数设置为大小写不敏感
  • const可以定义类常量,而define()不能

魔术常量

PHP提供了一系列预定义的常量,它们的值会随着在代码中的位置改变而改变。

魔术常量示例
<?php
echo "当前行号: " . __LINE__ . "<br>";
echo "文件路径: " . __FILE__ . "<br>";
echo "文件目录: " . __DIR__ . "<br>";

function testFunction() {
    echo "函数名称: " . __FUNCTION__ . "<br>";
}

testFunction();

class TestClass {
    public function testMethod() {
        echo "类名称: " . __CLASS__ . "<br>";
        echo "方法名称: " . __METHOD__ . "<br>";
    }
}

$obj = new TestClass();
$obj->testMethod();
?>

预定义常量

PHP还提供了许多预定义常量,用于获取PHP版本信息、操作系统信息等。

预定义常量示例
<?php
echo "PHP版本: " . PHP_VERSION . "<br>";
echo "操作系统: " . PHP_OS . "<br>";
echo "最大整数值: " . PHP_INT_MAX . "<br>";
echo "浮点数精度: " . PHP_FLOAT_DIG . "<br>";
echo "目录分隔符: '" . DIRECTORY_SEPARATOR . "'<br>";
echo "路径分隔符: '" . PATH_SEPARATOR . "'<br>";
?>

变量和常量的最佳实践

遵循最佳实践可以编写更安全、更易维护的代码。

变量初始化

始终在使用变量前进行初始化,避免未定义变量错误。

变量初始化示例
<?php
// 不好的做法
// echo $undefinedVariable;  // 会产生警告

// 好的做法
$name = '';
$age = 0;
$isActive = false;

// 或者使用isset()检查
if (isset($undefinedVariable)) {
    echo $undefinedVariable;
} else {
    echo "变量未定义";
}
?>

变量类型检查

在处理用户输入或不确定类型的变量时,进行类型检查。

变量类型检查示例
<?php
$input = "123";

// 检查变量类型
if (is_string($input)) {
    echo "输入是字符串<br>";
}

if (is_numeric($input)) {
    echo "输入是数字<br>";
}

// 类型转换
$number = (int)$input;
echo "转换为整数: $number<br>";

// 使用filter_var进行验证
$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "有效的邮箱地址<br>";
}
?>

常量命名规范

使用有意义的常量名称,并遵循一致的命名约定。

常量命名规范示例
<?php
// 配置常量
define("APP_NAME", "我的应用");
define("APP_VERSION", "1.0.0");
define("DEBUG_MODE", true);

// 数据库常量
define("DB_HOST", "localhost");
define("DB_NAME", "my_database");
define("DB_USER", "username");
define("DB_PASS", "password");

// 路径常量
define("ROOT_PATH", dirname(__FILE__));
define("UPLOAD_PATH", ROOT_PATH . '/uploads');

echo "应用名称: " . APP_NAME . "<br>";
echo "根路径: " . ROOT_PATH . "<br>";
?>

实践练习

创建一个PHP程序,实现以下功能:

  1. 定义几个不同类型的变量(字符串、数字、布尔值)
  2. 使用全局变量和局部变量
  3. 创建一个静态变量,观察其行为
  4. 定义几个常量并在程序中使用
  5. 使用可变变量
  6. 实现一个简单的配置系统
提示: 可以创建一个简单的用户信息管理系统,使用变量存储用户信息,常量存储系统配置。
实践练习示例
<?php
// 定义配置常量
define("APP_NAME", "用户管理系统");
define("MAX_USERS", 100);
define("DEFAULT_ROLE", "user");

// 用户信息变量
$username = "张三";
$email = "zhangsan@example.com";
$age = 25;
$isActive = true;

// 使用静态变量统计函数调用次数
function logAction($action) {
    static $callCount = 0;
    $callCount++;
    echo "动作: $action (第 $callCount 次调用)<br>";
}

// 使用可变变量动态访问属性
$properties = ['username', 'email', 'age'];
foreach ($properties as $prop) {
    echo ucfirst($prop) . ": " . $$prop . "<br>";
}

// 输出应用信息
echo "<h3>" . APP_NAME . "</h3>";
echo "最大用户数: " . MAX_USERS . "<br>";
echo "默认角色: " . DEFAULT_ROLE . "<br>";

// 记录用户操作
logAction("用户登录");
logAction("查看资料");
logAction("修改设置");
?>