第七节 类的静态成员 [7]

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

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

我们在下例中使用了一个静态属性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");
?>

(0)

相关推荐

  • 第七节--类的静态成员

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

  • 第七节 类的静态成员 [7]

    类的静态成员与一般的类成员不同: 静态成员与对象的实例无关,只与类本身有关. 他们用来实现类要封装的功能和数据,但不包括特定对象的功能和数据. 静态成员包括静态方法和静态属性. 静态属性包含在类中要封装的数据,可以由所有类的实例共享. 实际上,除了属于一个固定的类并限制访问方式外,类的静态属性非常类似于函数的全局变量 我们在下例中使用了一个静态属性Counter::$count. 它属于Counter类,而不属于任何Counter的实例.你不能用this来引用它,但可以用self或其它有效的命名

  • C++ 类的静态成员深入解析

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 静态成员的定义或声明要加个关键static.静态成员可以通过双冒号来使用即<类名>::<静态成员名>. 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象.希望阅读本文可以使读者对类的静

  • C++类的静态成员变量与静态成员函数详解

    目录 1.类的静态成员变量 2.静态成员函数 总结 1.类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间. 3.静态成员变量通过类名访问,也可以通过对象访问,同一类的不同对象,静态成员共享同一份数据 下面通过代码验证以上三种说法: #include <iostream> using namespace std; class Base{ public: static int va

  • C++分析讲解类的静态成员变量是什么

    目录 一.成员变量的回顾 二.新的需求 三.静态成员变量 四.小结 一.成员变量的回顾 通过对象名能够访问 public 成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 二.新的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 下面来看示例: #include <stdio.h> int gCount = 0; class Test { private: int mCount; public: Test() : mC

  • C++分析讲解类的静态成员函数如何使用

    目录 一.未完成的需求 二.问题分析 三.静态成员函数 四.小结 一.未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 在[C++基础入门]20.C++中类的静态成员变量中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码: #include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() {

  • C++类的静态成员初始化详细讲解

    记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 复制代码 代码如下: #include <iostream>using namespace std;class test{public:static int num;};int test::num = 0;void main(){cout<<test::num <<endl;test::

  • C++类与对象深入之静态成员与友元及内部类详解

    目录 一:静态成员 1.1:静态成员分类 1.2:静态成员变量 1.3:静态成员函数 1.4:总结特性 1.5:试题示例 1.6:C++11成员初始化新玩法 二:友元 2.1:全局函数做友元 2.2:类做友元 2.3:成员函数做友元 三:内部类 3.1:概念 3.2:特性 一:静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员.C++里面尽量用静态成员变量代替全局变量. 1.1:静态成员分类 1️静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,

  • php class类的用法详细总结

    一:结构和调用(实例化): class className{} ,调用:$obj = new className();当类有构造函数时,还应传入参数.如$obj = new className($v,$v2-); 二:构造函数和析构函数: 1.构造函数用于初始化:使用__construct(),可带参数. 2.但析构函数不能带参数(用于在销去一个类之前执行一些操作或功能).析构函数用__destruct()做名称.在脚本执行结束时,会销掉内存中的对象,因此可不用析造函数,但有些比如COOKIE等

  • 2010年最新PHP类的精髓归纳第1/2页

    一:结构和调用(实例化):class className{} ,调用:$obj = new className();当类有构造函数时,还应传入参数.如$obj = new className($v,$v2...); 二:构造函数和析构函数:1.构造函数用于初始化:使用__construct(),可带参数.2.但析构函数不能带参数(用于在销去一个类之前执行一些操作或功能).析构函数用__destruct()做名称.在脚本执行结束时,PHP会销掉内存中的对象,因此可不用析造函数,但有些比如COOKI

随机推荐