构造函数是在对象初始化(其内存分配,实例属性复制等)之后执行的函数。其目的是将对象置于有效状态。
通常,处于可用状态的对象需要一些数据。构造函数的目的是强制在实例化时将该数据提供给对象,并禁止没有这些数据的任何实例。
考虑一个简单的类,它封装一个字符串,并有一个方法返回此字符串的长度。一个可能的实现是:
class StringWrapper {
private $str;
public function setInnerString($str) {
$this->str = (string) $str;
}
public function getLength() {
if ($this->str === null)
throw new RuntimeException("Invalid state.");
return strlen($this->str);
}
}
为了处于有效状态,此函数需要在getLength之前调用setInnerString。通过使用构造函数,可以强制所有实例在调用getLength时处于良好状态:
class StringWrapper {
private $str;
public function __construct($str) {
$this->str = (string) $str;
}
public function getLength() {
return strlen($this->str);
}
}
您还可以保留setInnerString以允许在实例化后更改字符串。
当一个对象将要从内存中释放时,调用析构函数。通常,它包含清理代码(例如,关闭对象持有的文件描述符)。它们在PHP中很少见,因为PHP会在脚本执行结束时清除脚本所拥有的所有资源。