PHP魔法函数和超全局数组介绍——第一阶段
文章目录
- 一、PHP中常用的魔法函数
- 1. __construct() - 构造方法
- 2. __destruct() - 析构方法
- 3. __sleep() 与 __wakeup()
- 4. __call() 与 __callStatic()
- 5. __delete()
- 二、PHP中超全局数组
- 1. $_GET 数组
- 2. $_POST 数组
- 3. $_FILES 数组
一、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, 2Tool::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 中,GET、_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 "文件上传成功!";}
}
常见用途:头像上传、附件上传、图片上传等场景。