第四节--构造函数和析构函数


Posted in PHP onNovember 16, 2006

+-------------------------------------------------------------------------------+
| = 本文为Haohappy读<<Core PHP Programming>> 
| = 中Classes and Objects一章的笔记 
| = 翻译为主+个人心得 
| = 为避免可能发生的不必要的麻烦请勿转载,谢谢 
| = 欢迎批评指正,希望和所有PHP爱好者共同进步! 
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
+-------------------------------------------------------------------------------+
*/

第四节--构造函数和析构函数

如果你在一个类中声明一个函数,命名为__construct,这个函数将被当成是一个构造函数并在建立一个对象实例时被执行. 清楚地说,__是两个下划线. 就像其它任何函数一样,构造函数可能有参数或者默认值. 你可以定义一个类来建立一个对象并将其属性全放在一个语句(statement)中. 

你也可以定义一个名为__destruct的函数,PHP将在对象被销毁前调用这个函数. 它称为析构函数.

继承是类的一个强大功能. 一个类(子类/派生类)可以继承另一类(父类/基类)的功能. 派生类将包含有基类的所有属性和方法,并可以在派生类中加上其他属性和方法. 你也可以覆写基类的方法和属性. 就像3.1.2中显示的,你可以用extends关键字来继承一个类.

你可能想知道构造函数是如何被继承的. 当它们和其它方法一起被继承时,他们不会在创建对象时被执行.
如果你需要这个功能,你需要用第二章提到的::运算符. 它允许你指向一块命名空间. parent指向父类命名空间,你可以用parent::__construct来调用父类的构造函数.

一些面向对象语言在类之后命名构造函数. PHP的前几个版本也是如此,到现在这种方法仍然有效.也就是:如果你把一个类命名为Animal并且在其中建立一个命名也是Animal的方法,则这个方法就是构造函数.如果一个类的同时拥有__construt构造函数和与类名相同的函数,PHP将把__construct看作构造函数.这使得用以前的PHP版本所写的类仍然可以使用. 但新的脚本(PHP5)应当使用__construct. 

PHP的这种新的声明构造函数的方法可以使构造函数有一个独一无二的名称,无论它所在的类的名称是什么. 这样你在改变类的名称时,就不需要改变构造函数的名称.

你可能在PHP中给构造函数一个像其它类方法一样的访问方式. 访问方式将会影响从一定范围内实例化对象的能力. 这允许实现一些固定的设计模式,如Singleton模式.

析构函数,相反于构造函数. PHP调用它们来将一个对象从内存中销毁. 默认地,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源. 析构函数允许你在使用一个对象之后执行任意代码来清除内存.

当PHP决定你的脚本不再与对象相关时,析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候. 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值. 通常将变量赋值勤为NULL或者调用unset .

下面的例子中,计算从类中实例化的对象的个数. Counter类从构造函数开始增值,在析构函数减值.

一旦你定义了一个类,你可以用new来建立一个这个类的实例. 类的定义是设计图,实例则是放在装配线上的元件. New需要类的名称,并返回该类的一个实例. 如果构造函数需要参数,你应当在new后输入参数.

<?php   
   class Counter   
   {   
       private static $count = 0;          function __construct()   
       {   
           self::$count++;   
       }   
       function __destruct()   
       {   
           self::$count--;   
       }   
       function getCount()   
       {   
           return self::$count;   
       }   
   }   
   //建立第一个实例   
   $c = new Counter();   
   //输出1   
   print($c->getCount() . "<br>\n");   
   //建立第二个实例   
   $c2 = new Counter();   
   //输出2   
   print($c->getCount() . "<br>\n");   
   //销毁实例   
   $c2 = NULL;   
   //输出1   
   print($c->getCount() . "<br>\n");   
?>  

当你新建了一个实例,内存会被准备来存储所有属性. 每个实例有自己独有的一组属性. 但方法是由该类的所有实例共享的. 

PHP 相关文章推荐
用PHP编写PDF文档生成器
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
?生?D片??C字串
Dec 06 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
PHP 函数学习简单小结
Jul 08 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
Jul 29 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
第三节--定义一个类
Nov 16 #PHP
第二节--PHP5 的对象模型
Nov 16 #PHP
第一节--面向对象编程
Nov 16 #PHP
MYSQL数据库初学者使用指南
Nov 16 #PHP
php.ini 中文版
Oct 28 #PHP
一个可以找出源代码中所有中文的工具
Oct 25 #PHP
《APMServ 5.1.2》使用图解
Oct 23 #PHP
You might like
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
Python常用列表数据结构小结
2014/08/06 Python
python获取目录下所有文件的方法
2015/06/01 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
技校毕业生个人学习的自我评价
2014/02/21 职场文书
大跃进口号
2014/06/16 职场文书
2014年教育工作总结
2014/11/26 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
Elasticsearch 数据类型及管理
2022/04/19 Python