第七章:第4节 PHP面向对象——构造方法与析构方法

更新于:2021-11-25 10:30:37

还是那个Person类,我们可以$p1 = new Person();//实例化一个对象,其实可以把小括号省略掉。


1.png

第6行、18行小括号去掉了,不报错,可以正常运行。那这个小括号是不是可有可无,一点左右没有?


其实不是,小括号是用来传参数的,参数传给谁?——构造方法(构造函数)。


构造方法:


构造方法是类中的一个“特殊”方法,其作用是在实例化创建新对象时优先调用这个方法。该对象可以用这个方法给自己的属性赋值,使之对象一创建完成,就具有了其本身的特有数据(属性值),所以非常适合在使用对象之前做一些初始化工作。


1,该方法名字是固定的,为:__construct();

2,该方法必须是普通方法(不能是静态方法)

3,通常该方法应该是public

4,通常该方法中使用$this这个关键字来对属性进行赋值

5,当new 类名()的时候,其实是在调用该构造方法

6,如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配


在Person类中定义一个构造方法:


1.png


在实例化对象时就可以直接传参了


1.png

1.png

当构造方法有形参时,实例化时不传参数就会报错误的。


一个类没有定义构造方法,PHP会为类默认一个空的构造方法。


构造方法通常定义在其他方法的前边。


析构方法:


构造方法是“创建”对象的时候会自动调用。

析构方法是“销毁”对象的时候会自动调用。


析构方法通常用于在销毁对象的时候来“清理数据”(打扫战场)——如果需要,就可以利用这个机会去处理。


该方法名字是固定的,为:__destruct();


1.png


在Person类中加了一个析构方法,还是原来的执行代码,看结果:


1.png


对象的析构方法被调用有这样的规律,优先定义的对象最后被“析构”,“先进后出,像一个栈的数据结构一样。

备注:PHP7以后版本,在不提前销毁对象的前提下,对象析构方法按照实例的先后顺序执行】


具体说明:

1,析构方法通常不太需要去定义,默认为空就好。

2,析构方法不能代码中主动调用。

3,析构方法不能有形参。

4,析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。


对象销毁的两种情形:


①隐试销毁:脚本程序运行结束,自动销毁;

注意:是在脚本运行最后销毁。


②显试销毁 : 当对象没有被引用时就会被销毁,unset()一个对象变量或者改变对象变量的值,被销毁;

注意:是立马销毁。


实际上,更本质来说,当一个对象(new 出来的对象)没有任何一个变量指向它的时候,该对象就会被自动销毁——自然,如果整个程序结束,也会销毁。


在我们的手册里有这样一句:“析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中 调用exit()将会中止其余关闭操作的运行。”


在代码中演示一下:


1.png

1.png

$p1对象刚创建完,就exit了,$p1对象的析构方法依然可以执行。



额外提示:PHP对象在PHP出现错误时,是不执行析构方法的。


实际应用中,构造方法比析构方法有用多了。


本节学习代码》》》