与大多数面向对象语言一样,您也可以在 PHP 的类中定义构造函数。使用 new 运算符声明对象时,不会为其成员变量分配任何值。
构造函数 用于在声明时初始化每个新对象。PHP 还支持使用 析构函数 从内存中销毁对象,因为它不再有任何引用。
构造函数
PHP 提供了一个 __construct() 函数来初始化一个对象。
__construct(mixed ...$values = ""): void
类中的构造函数方法在每个新创建的对象上自动调用。请注意,定义构造函数不是必需的。但是,如果存在,则它适用于对象在使用之前可能需要的任何初始化。
你可以将任意数量的参数传递到 构造函数 中。__construct() 函数没有任何返回值。
让我们在上一章中使用的 Book 类中定义一个构造函数
<?php
class Book {
/* 成员变量 */
var $price;
var $title;
/* 构造函数 */
function __construct(){
$this->title = "PHP 基本知识";
$this->price = 275;
}
/* 成员函数 */
function getPrice() {
echo "价格: $this->price \n";
}
function getTitle(){
echo "标题: $this->title \n";
}
}
$b1 = new Book;
$b1->getTitle();
$b1->getPrice();
?>
它将产生以下输出 -
价格: 275
参数化构造函数
$b1 的成员变量已初始化,而不必调用 setTitle() 和 setPrice() 方法,因为构造函数是在声明对象后立即调用的。但是,将为每个对象调用此构造函数,因此每个对象具有相同的 title 和 price 属性值。
要使用不同的值初始化每个对象,请使用参数定义 __construct() 函数。
将 __construct() 函数的定义更改为以下内容 -
function __construct($param1, $param2) {
$this->title = $param1;
$this->price = $param2;
}
要初始化对象,请将值传递给声明中括号内的参数。
$b1 = new Book("PHP 基本知识", 375);
例子
现在,您可以让每个对象对成员变量具有不同的值。
<?php
class Book {
/* 成员变量 */
var $price;
var $title;
/* 构造函数 */
function __construct($param1, $param2) {
$this->title = $param1;
$this->price = $param2;
}
/* 成员函数 */
function getPrice(){
echo "价格: $this->price \n";
}
function getTitle(){
echo "标题: $this->title \n";
}
}
$b1 = new Book("PHP 基本知识", 375);
$b2 = new Book("PHP 编程知识", 450);
$b1->getTitle();
$b1->getPrice();
$b2->getTitle();
$b2->getPrice();
?>
它将产生以下输出 -
价格: 375
标题: PHP 编程知识
价格: 450
构造函数重载
方法重载是面向对象编程中的一个重要概念,其中一个类可能具有多个构造函数定义,每个定义具有不同数量的参数。但是,PHP 不支持方法重载。可以通过在 构造函数 中使用具有默认值的参数来克服此限制。
将 __construct() 函数更改为以下内容 -
function __construct($param1="PHP 基本知识", $param2=380) {
$this->title = $param1;
$this->price = $param2;
}
现在,声明一个对象而不传递参数,另一个对象带有参数。一个没有参数的参数将使用默认参数进行初始化,另一个参数将使用传递的值进行初始化。
$b1 = new Book();
$b2 = new Book("PHP 编程知识", 450);
它将产生以下输出 -
Price: 380
Title: PHP 编程知识
Price: 450
构造函数的类型声明
由于 PHP(7.0 版以上)允许对函数参数进行标量类型声明,因此 __construct() 函数可以定义为 −
function __construct(string $param1="PHP 基本知识", int $param2=380) {
$this->title = $param1;
$this->price = $param2;
}
注意:PHP 早期版本允许使用类的名称来定义构造函数,但从 PHP 版本 8.0 开始,此功能已被弃用。
析构函数
PHP 也有一个 __destructor() 函数。它实现的析构函数概念类似于其他面向对象的语言,如 C++ 的 析构函数 概念。一旦没有对特定对象的其他引用,就会调用 析构函数 方法。
__destruct(): void
__destruct() 函数没有任何参数,也没有任何返回值。当任何对象超出范围时,会自动调用 __destruct() 函数这一事实可以通过将 var_dump($this) 放入函数中来验证。
如上所述,$this 带有对调用对象的引用,则转储显示成员变量设置为 NULL
在 Book 类中添加析构函数,如下所示 -
function __destruct() {
var_dump($this);
echo "对象被销毁";
}
当程序退出时,将显示以下输出 -
["price"]=>
NULL
["title"]=>
NULL
}
对象被销毁