博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 面向对象编程实例 __construct 和 __destruct 区别
阅读量:5161 次
发布时间:2019-06-13

本文共 2615 字,大约阅读时间需要 8 分钟。

大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方 法。构 造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构 造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜索一个php4中的写法,与类名相同名的构造方法。

格式:function __construct ( [参数] ) { ... ... }

在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。

01 <?
02 //创建一个人类
03 class Person
04 {
05     //下面是人的成员属性
06     var $name; //人的名子
07     var $sex; //人的性别
08     var $age; //人的年龄
09  
10     //定义一个构造方法参数为姓名$name、性别$sex和年龄$age
11     function __construct($name, $sex, $age) {
12         //通过构造方法传进来的$name给成员属性$this->name赋初使值
13         $this->name = $name;
14         //通过构造方法传进来的$sex给成员属性$this->sex赋初使值
15         $this->sex = $sex;
16         //通过构造方法传进来的$age给成员属性$this->age赋初使值
17         $this->age = $age;
18     }
19  
20     //这个人的说话方法
21     function say() {
22         echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
23     }
24 }
25  
26 //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
27 $p1 = new Person("张三","男", 20);
28 $p2 = new Person("李四","女", 30);
29 $p3 = new Person("王五","男", 40);
30  
31 //下面访问$p1对象中的说话方法
32 $p1->say();
33 //下面访问$p2对象中的说话方法
34 $p2->say();
35 //下面访问$p3对象中的说话方法
36 $p3->say();
37 ?>

输出结果为:

我的名子叫:张三 性别:男 我的年龄是:20我的名子叫:李四 性别:女 我的年龄是:30我的名子叫:王五 性别:男 我的年龄是:40

如图:

PHP面向对象(OOP)编程完全教程:8.构造方法与析构方法

析构函数:

与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。 析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件, 释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似, 一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数

格式:function __destruct ( ) { ... ... }

01 <?
02 //创建一个人类
03 class Person
04 {
05     //下面是人的成员属性
06     var $name; //人的名子
07     var $sex; //人的性别
08     var $age; //人的年龄
09  
10     //定义一个构造方法参数为姓名$name、性别$sex和年龄$age
11     function __construct($name, $sex, $age) {
12         //通过构造方法传进来的$name给成员属性$this->name赋初使值
13         $this->name = $name;
14         //通过构造方法传进来的$sex给成员属性$this->sex赋初使值
15         $this->sex = $sex;
16         //通过构造方法传进来的$age给成员属性$this->age赋初使值
17         $this->age = $age;
18     }
19  
20     //这个人的说话方法
21     function say() {
22         echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age;
23     }
24  
25     //这是一个析构函数,在对象销毁前调用
26     function __destruct() {
27         echo "再见" . $this->name;
28     }
29 }
30  
31 //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
32 $p1 = new Person("张三", "男", 20);
33 $p2 = new Person("李四", "女", 30);
34 $p3 = new Person("王五", "男", 40);
35  
36 //下面访问$p1对象中的说话方法
37 $p1->say();
38 //下面访问$p2对象中的说话方法
39 $p2->say();
40 //下面访问$p3对象中的说话方法
41 $p3->say();
42 ?>

输出结果为:

我的名子叫:张三 性别:男 我的年龄是:20我的名子叫:李四 性别:女 我的年龄是:30我的名子叫:王五 性别:男 我的年龄是:40
再见王五
再见李四
再见张三

 注意:

由于类实例是以堆栈的形式放在内存中,所以最后调用 析构函数 的时候,输出顺序是按 后进先出 的原则!

 

转载于:https://www.cnblogs.com/timelesszhuang/p/3682799.html

你可能感兴趣的文章
游戏中的心理学(一):认知失调有前提条件
查看>>
SpringMVC-处理AJAX
查看>>
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
[转载]mysql的left,right,substr,instr截取字符串,截取
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
摘抄详细的VUE生命周期
查看>>
javascript高级程序设计---js事件思维导图
查看>>
sprint计划会议
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
Bouncy Castle内存溢出
查看>>
多线程_java多线程环境下栈信息分析思路
查看>>
机器学习数学【1】
查看>>