第七节--类的静态成员


Posted in PHP onNovember 16, 2006

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

第七节--类的静态成员

类的静态成员与一般的类成员不同: 静态成员与对象的实例无关,只与类本身有关. 他们用来实现类要封装的功能和数据,但不包括特定对象的功能和数据. 静态成员包括静态方法和静态属性.

静态属性包含在类中要封装的数据,可以由所有类的实例共享. 实际上,除了属于一个固定的类并限制访问方式外,类的静态属性非常类似于函数的全局变量

我们在下例中使用了一个静态属性Counter::$count. 它属于Counter类,而不属于任何Counter的实例.你不能用this来引用它,但可以用self或其它有效的命名表达. 在例子中,getCount方法返回self::$count,而不是Counter::$count.

静态方法则实现类需要封装的功能,与特定的对象无关. 静态方法非常类似于全局函数. 静态方法可以完全访问类的属性,也可以由对象的实例来访问,不论访问的限定语是否是什么.

在6.3例中,getCount是一个普通的方法,用->来调用. PHP建立一个this变量,尽管方法没有使用到.但是,getCount不属于任何对象.在有些情况下,我们甚至希望在不存在有效的对象时调用它,那么就应该使用静态方法. PHP将不在静态方法内部建立this变量,即使你从一个对象中调用它们.

例子6.7由6.3改变getCount为静态方法而来. Static关键字不能阻止一个实例用->运算符来调用getCount,但PHP将不在方法内部建立this变量.如果你使用this->来调用,将会出错.

//6.3例指第四节--构造函数和析构函数中的例子(参看前文),通过两个例子的比较,你可以很好掌握
//static方法与普通方法之间的区别.

你可以写一个方法通过判断this是否建立来显示是否它被静态地或者非静态地调用. 当然,如果你用了static 关键字,不管它怎样被调用,这个方法总是静态的.

你的类也可以定义常量属性,不需要使用public static,只需要用const关键字即可. 常量属性总是静态的.它们是类的属性,而不是实例化该类的对象的属性.

Listing 6.7 Static members

<?php   
   class Counter   
   {   
       private static $count = 0;   
       const VERSION = 2.0;          function __construct()   
       {   
           self::$count++;   
       }   
       function __destruct()   
       {   
           self::$count--;   
       }   
       static function getCount()   
       {   
           return self::$count;   
       }   
   };   
   //创建一个实例,则__construct()将执行   
   $c = new Counter();   
   //输出 1   
   print(Counter::getCount() . "<br>\n");   
   //输出类的版本属性   
   print("Version used: " . Counter::VERSION . "<br>\n");   
?>  
PHP 相关文章推荐
dedecms模板标签代码官方参考
Mar 17 PHP
PHP关联链接常用代码
Nov 05 PHP
PHP分页类集锦
Nov 18 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
php如何执行非缓冲查询API
Jul 22 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
PHP使用CURL实现下载文件功能示例
Jun 03 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
实例讲解PHP表单
Jun 10 PHP
第六节--访问属性和方法
Nov 16 #PHP
第五节--克隆
Nov 16 #PHP
第四节--构造函数和析构函数
Nov 16 #PHP
第三节--定义一个类
Nov 16 #PHP
第二节--PHP5 的对象模型
Nov 16 #PHP
第一节--面向对象编程
Nov 16 #PHP
MYSQL数据库初学者使用指南
Nov 16 #PHP
You might like
php代码审计比较有意思的例子
2014/05/07 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
python开发简易版在线音乐播放器
2017/03/03 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
django 简单实现登录验证给你
2019/11/06 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
优秀教师演讲稿
2014/05/06 职场文书
参赛口号
2014/06/16 职场文书
学校光盘行动倡议书
2015/04/28 职场文书