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关键字在类定义之外定义常量。
<?php
// 使用const定义常量
const DB_HOST = "localhost";
const DB_USER = "root";
const DB_PASS = "password";
echo "数据库主机: " . DB_HOST;
?>
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程序,实现以下功能:
- 定义几个不同类型的变量(字符串、数字、布尔值)
- 使用全局变量和局部变量
- 创建一个静态变量,观察其行为
- 定义几个常量并在程序中使用
- 使用可变变量
- 实现一个简单的配置系统
<?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("修改设置");
?>