深入解析:PHP魔法函数和超全局数组介绍——第一阶段
文章目录
一、PHP中常用的魔法函数
在 PHP 中,魔术方法为类提供了特殊的行为处理能力,以下是你提到的几个魔术方法的详细介绍和示例:
1. __construct() - 构造方法
作用:在创建对象时自动调用,用于初始化对象的属性或资源。
示例:
class Database {
private $connection;
// 构造方法:初始化数据库连接
public function __construct($host, $user, $pass) {
$this->
connection = mysqli_connect($host, $user, $pass);
echo "数据库连接已建立\n";
}
}
// 创建对象时自动触发 __construct()
$db = new Database('localhost', 'root', '123456');
2. __destruct() - 析构方法
作用:当对象被销毁(脚本结束或手动销毁)时自动调用,用于释放资源。
示例:
class File {
private $handle;
public function __construct($filename) {
$this->
handle = fopen($filename, 'w');
}
// 析构方法:关闭文件资源
public function __destruct() {
if ($this->
handle) {
fclose($this->
handle);
echo "文件资源已释放\n";
}
}
}
$file = new File('test.txt');
unset($file);
// 手动销毁对象,触发 __destruct()
3. __sleep() 与 __wakeup()
**__sleep():**序列化对象时(serialize())自动调用,返回需要序列化的属性数组。
**__wakeup():**反序列化对象时(unserialize())自动调用,用于恢复资源或重新初始化。
示例:
class User {
public $name;
private $lastLogin;
private $connection;
// 假设这是一个数据库连接(不可序列化)
public function __construct($name) {
$this->
name = $name;
$this->
lastLogin = time();
$this->
connection = mysqli_connect('localhost', 'root', '123456');
}
// 序列化时指定需要保存的属性(排除不可序列化的connection)
public function __sleep() {
return ['name', 'lastLogin'];
}
// 反序列化时恢复资源
public function __wakeup() {
$this->
connection = mysqli_connect('localhost', 'root', '123456');
echo "反序列化后重新建立连接\n";
}
}
$user = new User('张三');
$serialized = serialize($user);
// 触发 __sleep()
$unserialized = unserialize($serialized);
// 触发 __wakeup()
echo $unserialized->
name;
// 输出:张三
4. __call() 与 __callStatic()
**__call():**调用对象的不可访问方法(如私有方法或未定义方法)时自动调用。
**__callStatic():**调用类的不可访问静态方法时自动调用。
示例:
class Tool {
// 处理对象的不可访问方法
public function __call($method, $params) {
echo "调用了实例方法 {
$method
},参数:" . implode(', ', $params) . "\n";
}
// 处理静态的不可访问方法
public static function __callStatic($method, $params) {
echo "调用了静态方法 {
$method
},参数:" . implode(', ', $params) . "\n";
}
}
$tool = new Tool();
$tool->
foo(1, 2);
// 触发 __call(),输出:调用了实例方法 foo,参数:1, 2
Tool::bar('a', 'b');
// 触发 __callStatic(),输出:调用了静态方法 bar,参数:a, b
5. __delete()
作用:当使用 unset() 删除对象的不可访问属性时自动调用(PHP 5.1.0+)。
示例:
class Config {
private $settings = ['debug' =>
false, 'cache' =>
true];
// 删除不可访问的属性时触发
public function __delete($name) {
if (isset($this->
settings[$name])) {
unset($this->
settings[$name]);
echo "已删除属性 {
$name
}\n";
}
}
}
$config = new Config();
unset($config->
debug);
// 触发 __delete(),输出:已删除属性 debug
二、PHP中超全局数组
在 PHP 中, G E T 、 _GET、 GET、_POST 和 $_FILES 并不是函数,而是超全局数组(superglobal arrays),它们用于接收客户端发送到服务器的数据,具有全局作用域,在脚本的任何位置都可以直接访问。以下是它们的详细介绍:
1. $_GET 数组
作用:用于获取通过 HTTP GET 方法 提交的数据,通常来自 URL 中的查询字符串(即 URL 中 ? 后面的部分)。特点:
- 数据会显示在 URL 中,安全性较低
- 传输的数据量有限(通常受浏览器和服务器限制)
- 适用于传递非敏感数据(如查询参数、分页参数等)
示例:如果访问 URL:http://example.com/index.php?name=张三&age=20,可以通过 $_GET 获取参数:
// 获取 URL 中的参数
$name = $_GET['name'] ?? '未知';
// 从 GET 数据中获取 name 参数
$age = $_GET['age'] ?? 0;
// 从 GET 数据中获取 age 参数
echo "姓名:{
$name
},年龄:{
$age
}";
// 输出:姓名:张三,年龄:20
常见用途:搜索查询、分页(page=1)、数据筛选等。
2. $_POST 数组
作用:用于获取通过 HTTP POST 方法 提交的数据,数据不会显示在 URL 中,而是包含在请求体中。
特点:
- 数据不显示在 URL 中,相对安全
- 可传输的数据量较大(受服务器配置限制)
- 适用于传递敏感数据(如用户名、密码)或大量数据(如表单提交)
示例:处理一个表单提交(表单的 method=“post”):
<!-- 表单页面(form.html) -->
<form action="handle.php" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<button type="submit">提交</button>
</form>
// 处理页面(handle.php)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 从 POST 数据中获取表单字段
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
echo "提交的用户:{
$username
},密码:{
$password
}";
}
常见用途:用户登录、注册、表单提交等需要传输敏感数据的场景。
3. $_FILES 数组
作用:用于获取通过 HTTP POST 方法上传的文件 信息,如上传的图片、文档等。
特点:
- 必须与 POST 方法配合使用
- 表单需要设置 enctype=“multipart/form-data” 属性才能上传文件
- 每个上传的文件会包含文件名、临时路径、大小、类型等信息
示例:处理文件上传:
<!-- 上传表单 -->
<form action="upload.php" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="avatar"><br>
<button type="submit">上传</button>
</form>
// 处理上传(upload.php)
if ($_SERVER['REQUEST_METHOD'] === 'POST' &&
isset($_FILES['avatar'])) {
$file = $_FILES['avatar'];
// 输出文件信息
echo "原始文件名:" . $file['name'] . "<br>";
// 客户端的文件名
echo "临时存储路径:" . $file['tmp_name'] . "<br>";
// 服务器上的临时路径
echo "文件大小(字节):" . $file['size'] . "<br>";
// 文件大小
echo "文件类型:" . $file['type'] . "<br>";
// MIME类型
echo "错误代码:" . $file['error'] . "<br>";
// 0表示无错误
// 将临时文件移动到指定目录(永久保存)
if ($file['error'] === UPLOAD_ERR_OK) {
$targetPath = 'uploads/' . $file['name'];
move_uploaded_file($file['tmp_name'], $targetPath);
echo "文件上传成功!";
}
}
常见用途:头像上传、附件上传、图片上传等场景。

浙公网安备 33010602011771号