第七节--类的静态成员


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 相关文章推荐
用PHP开发GUI
Oct 09 PHP
如何在PHP中使用Oracle数据库(6)
Oct 09 PHP
PHP生成月历代码
Jun 14 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
php错误级别的设置方法
Jun 17 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 PHP
session 加入redis的实现代码
Jul 15 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
10个实用的脚本代码工具
2010/05/04 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Python高级用法总结
2018/05/26 Python
详解Python字典的操作
2019/03/04 Python
python环境下安装opencv库的方法
2020/03/05 Python
关于python中的xpath解析定位
2020/03/06 Python
python实现猜单词游戏
2020/05/22 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
教师年度个人总结
2015/02/11 职场文书
老龙头导游词
2015/02/11 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
个人廉洁自律总结
2015/03/06 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
box-shadow单边阴影的实现
2023/05/21 HTML / CSS