类中的构造函数

服务器君一共花费了26.027 ms进行了6次数据库查询,努力地为您提供了提供了这个页面。

通常,你可能希望在创建和撤销对象时执行一些任务。例如,可能希望立即为刚实例化的对象的多个字段赋值。但是,如果必须手工这样做,那么几乎肯定会忘记执行本该完成的任务。面向对象程序设计经过漫长的发展道路,终于可以通过提供一些特殊方法来消除出现这些错误的可能性。这些方法称为构造函数(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 = "Beginning Python";
    	print "Title: ".$this->title."<br />";
 	}
	
	public function getNumberCopies() {
    	$this->copies = "5";
     	print "Number copies available: ".$this->copies."<br />";
	}
}
$book = new book("159059519X");

运行结果如下:

Title: Beginning 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不支持构造函数重载。

Creative Commons License

本文仅供自己学习与收藏之用,请勿转载,请勿用作其它用途(如商业目的等)。 原文链接:http://www.nowamagic.net/librarys/posts/php/19