面向对象 - 构造方法和析构方法

  • 作者:KK

  • 发表日期:2017.2.23


有两个特殊的方法会在new和unset(或者被自动销毁)的时候被自动调用

构造方法__construct

class User{
	public function __construct(){
		echo 'user init';
	}
}

$user = new User();		// user init

就在User类被new的刻,__construct方法会被自动调用,通俗的话来讲它就是一个类的初始化方法,专业术语叫构造方法

平时如果想在一个类初始化的时候做点什么事就用这个方法了

更多示例

通常在初始化一个类的时候就初始化它的数据:

class Girl{
	private $_name = ''; //现在业内通常在给非public的属性起名时会加 _ 线开头标注特征,只是命名的一部分,对运行没特殊影响
	
	private $_age = '';

	//可以传参数,反正当函数用,就是自动调的
	public function __construct($name, $age){
		$this->_name = $name;
		$this->_age = $age;
	}
	
	public function introduce(){
		echo '你好,我叫' . $this->_name . ' 年龄大概是' . ($this->_age - 3) . '左右,你猜~';
	}
}

$girl1 = new Girl('琳琳', 28); // 传参
$girl2 = new Girl('小舒', 24);

$girl1->introduce();
$girl2->introduce();

析构方法__destruct

这个又叫析构方法,它没有参数,会在类的实例变量被销毁时自动调用:

class User{
	public function __destruct(){
		echo '我要被销毁了……';
	}
}

$user = new User();
echo 11;
unset($user); // 我要被销毁了……
echo 22;

unset可以销毁一个变量嘛,所以变量被销毁时destruct方法被自动执行了

可是如果删除上面的unset语句还是会被执行,因为PHP脚本跑完的时候,PHP虚拟机会自动删除所有变量,所以也等于自动unset


一个函数结束时也会自动删除变量

class User{
	public function __destruct(){
		echo '我要被销毁了……';
	}
}

function test(){
	$user = new User();
}
echo 11;
test(); // 函数执行完毕退出来的时候,$user变量也会被销毁
echo 22;

实际上__destruct很少使用

很少程序员有需要在一个类被销毁时做点什么事,但确实也总是有的,在这个阶段就不说了

知道有它的存在就好,有时候会出现在一些面试题目中,不懂就懵了


两个方法都要public

就是指作用域啦,如果你改成private function __construct(){}就会报错