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


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 pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
PHP 数组入门教程小结
May 20 PHP
php 中文和编码判断代码
May 16 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
php 后端实现JWT认证方法示例
Sep 04 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
使用PHP开发留言板功能
Nov 19 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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
phpQuery占用内存过多的处理方法
2013/11/13 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP中header用法小结
2016/05/23 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
javascript如何实现create方法
2019/11/04 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
党员教师工作决心书
2014/03/13 职场文书
门卫岗位职责
2015/02/09 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript