通常,你可能希望在创建和撤销对象时执行一些任务。例如,可能希望立即为刚实例化的对象的多个字段赋值。但是,如果必须手工这样做,那么几乎肯定会忘记执行本该完成的任务。面向对象程序设计经过漫长的发展道路,终于可以通过提供一些特殊方法来消除出现这些错误的可能性。这些方法称为构造函数(constructor)和析构函数(destructor),它们将在对象的创建和撤销过程中自动执行。
你通常希望在对象刚刚实例化时初始化某些字段,甚至触发执行某些函数。当然,可以在实例化后立即这么做,不过,如果能自动进行这些操作会更容易。OOP中就有这样一种机制,称为构造函数。很简单,构造函数定义为对象实例化时自动执行的一段代码。OOP 构造函数有一些优点:
- 构造函数可以接受参数,能够在创建对象时赋给特定的对象字段。
- 构造函数可以调用类方法或其他函数。
- 类的构造函数可以调用其他构造函数,包括父类的构造函数。
PHP通过名称__construct来识别构造函数。构造函数声明的一般语法如下:
function __construct([argument1,argument2,…argumentN])
{
//class initialization code
}
举个例子来说,假设希望立刻使用所提供的ISBN的特定信息来填充某本书的字段。例如,你可能希望知道书名和作者、图书馆里的这本书一共有多少本以及目前有多少本可借。代码如下:
class book
{
private $title;
private $isbn;
private $copies;
public function __construct($isbn)
{
$this->setIsbn($isbn);
$this->getTitle();
$this->getNumberCopies();
}
public function setIsbn($isbn)
{
$this->isbn = $isbn;
}
public function getTitle() {
$this->title = "Codercto Python";
print "Title: ".$this->title."<br />";
}
public function getNumberCopies() {
$this->copies = "5";
print "Number copies available: ".$this->copies."<br />";
}
}
$book = new book("159059519X");
运行结果如下:
Title: Codercto Python
Number copies available: 5
当然,实际的实现可能需要一些更智能的get方法(例如查询数据库的方法),但上面的方法已经能满足我们的要求。实例化书对象时,将自动调用该构造函数,相应地会调用setIsbn()、getTitle()和getNumberCopies()方法。如果知道每当实例化新对象时都会调用某些方法,那么这些方法最好通过构造函数自动调用,而不是尝试你自己手工来调用。
此外,如果要确保这些方法只能在构造函数中调用,就应当将其作用域设置为private,确保无法通过对象或子类直接调用。
调用父类构造函数
PHP不会自动调用父类的构造函数,必须使用parent关键字显式地调用。示例如下:
class Employee
{
protected $name;
protected $title;
function __construct()
{
echo "<p>staff constructor called!</p>";
}
}
class Manager extends Employee
{
function __construct(){
parent::__construct();
echo "<p>Manager constructor called</p>";
}
}
$employee =new Manager();
执行后的结果:
staff constructor called!
Manager constructor called
如果没有parent::__construct()调用,就只会调用唯一的Manager构造函数,如下:
Manager constructor called
调用无关的构造函数
可以调用与实例化对象没有任何关系的类构造函数,只需在__constructor前面加上类名即可,如下:
classname::__construct();
举个例子,假设前面实例中的Manager和staff类没有继承关系;相反,他们只是同一个库中的两个类。Employee构造函数依然可以在Manager构造函数中调用:
Employee::__construct()
这样调用Employee构造函数将得到与前面相同的结果。
你可能会考虑为什么没有讨论函数重载特性,许多OOP语言都有这个很有用的特性。答案很简单:PHP不支持构造函数重载。
猜你喜欢: