在 PHP 中,拷贝构造函数和赋值运算符重载是对象复制和赋值的两种方式。拷贝构造函数是在对象被复制时执行,并用于创建一个新的对象。赋值运算符重载是在对象被赋值时执行,并用于将一个对象的值赋给另一个对象。
在 PHP 中,拷贝构造函数和赋值运算符重载是对象复制和赋值的两种方式。拷贝构造函数是在对象被复制时执行,并用于创建一个新的对象。赋值运算符重载是在对象被赋值时执行,并用于将一个对象的值赋给另一个对象。
拷贝构造函数
拷贝构造函数在对象被复制时执行,并用于创建一个新的对象。以下是一个使用拷贝构造函数的示例:
class Person {
public $name;
function __construct($name) {
$this->name = $name;
}
function __clone() {
$this->name = "Cloned_" . $this->name;
}
}
$person1 = new Person("John");
$person2 = clone $person1;
echo $person1->name; // Output: John
echo $person2->name; // Output: Cloned_John
上面的代码中,我们在 Person 类中定义了一个名为 __clone()
的拷贝构造函数。在该方法中,我们将 $this->name
的值修改为 "Cloned_" . $this->name
。当 clone
运算符被应用于 $person1
时,它将调用 Person
类的 __clone()
方法,并创建一个新的对象 $person2
,其 name
属性值为 "Cloned_John"
。
赋值运算符重载
赋值运算符重载在对象被赋值时执行,并用于将一个对象的值赋给另一个对象。以下是一个使用赋值运算符重载的示例:
class Point {
public $x;
public $y;
function __construct($x = 0, $y = 0) {
$this->x = $x;
$this->y = $y;
}
function __toString() {
return "(" . $this->x . ", " . $this->y . ")";
}
function __set_state($array) {
return new Point($array['x'], $array['y']);
}
function __clone() {
$this->x *= -1;
$this->y *= -1;
}
function __invoke($x, $y) {
$this->x += $x;
$this->y += $y;
}
function __destruct() {
echo "Point destroyed.\n";
}
}
$p1 = new Point(1, 2);
$p2 = $p1;
$p3 = $p1;
var_dump($p1); // Output: object(Point)#1 (2) { ["x"]=> int(1) ["y"]=> int(2) }
var_dump($p2); // Output: object(Point)#1 (2) { ["x"]=> int(1) ["y"]=> int(2) }
var_dump($p3); // Output: object(Point)#1 (2) { ["x"]=> int(1) ["y"]=> int(2) }
$p1(1, 2);
var_dump($p1); // Output: object(Point)#1 (2) { ["x"]=> int(2) ["y"]=> int(4) }
var_dump($p2); // Output: object(Point)#1 (2) { ["x"]=> int(2) ["y"]=> int(4) }
var_dump($p3); // Output: object(Point)#1 (2) { ["x"]=> int(1) ["y"]=> int(2) }
上面的代码中,我们在 Point 类中定义了多个魔术方法。其中,__clone()
方法用于将 $this->x
和 $this->y
的值翻转为它们的相反数,__invoke()
方法用于将 $x
和 $y
的值分别加到 $this->x
和 $this->y
中,__set_state()
方法用于返回一个新的 Point 对象,__destruct()
方法用于在对象销毁时输出一条消息。
在代码末尾,我们将 $p1
的值分别赋给 $p2
和 $p3
,并使用 __invoke()
方法修改 $p1
的值。由于 $p2
和 $p3
与 $p1
是相同的对象实例,因此它们的值也会发生改变。当我们输出 $p1
、$p2
和 $p3
的值时,可以看到它们的值都变成了 (2, 4)
。而当程序结束时,__destruct()
方法会将 "Point destroyed."
输出到标准输出流。
本文标题为:php中拷贝构造函数、赋值运算符重载


基础教程推荐
- Laravel 解决composer相关操作提示php相关异常的问题 2023-03-08
- php去除deprecated的实例方法 2022-09-02
- PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br 2024-03-28
- PHP采用get获取url汉字出现乱码的解决方法 2024-03-28
- php生成短网址/短链接原理和用法实例分析 2023-04-20
- Laravel修改验证提示信息为中文的示例 2023-03-08
- php如何获取当前日期和星期 2024-12-06
- php+mysql开发的最简单在线题库(在线做题系统)完整案例 2023-01-04
- PHP laravel使用自定义邮件类实现发送邮件 2023-07-03
- PHP基于反射机制实现自动依赖注入的方法详解 2022-10-02