PHP 5.0对象模型深度探索之类的静态成员
静态属性包含在类中要封装的数据,可以由所有类的实例共享。实际上,除了属于一个固定的类并限制访问方式外,类的静态属性非常类似于函数的全局变量。
我们在下例中使用了一个静态属性Counter::$count。它属于Counter类,而不属于任何Counter的实例。你不能用this来引用它,但可以用self或其它有效的命名表达。在例子中,getCount方法返回self::$count,而不是Counter::$count。
静态方法则实现类需要封装的功能,与特定的对象无关. 静态方法非常类似于全局函数. 静态方法可以完全访问类的属性,也可以由对象的实例来访问,不论访问的限定语是否是什么.
在前文的例子中,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
代码如下:
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() . "n");
//输出类的版本属性
print("Version used: " . Counter::VERSION . "n");
?>
相关推荐
-
浅析PHP的静态成员函数效率更高的原因
很多php开发人员都知道, 使用类的静态成员函数效率比类的普通成员函数的要高,本文从应用层次分析这个问题 下面是一个范例: 复制代码 代码如下: <?php // php静态方法测试header('Content-Type: text/html; charset=utf-8');class xclass{ public static $var1 = '1111111111111111'; public $var2 = 'aaaaaaaaaaaaa'; public fun
-
PHP静态成员变量
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 1.静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始
-
php静态成员方法和静态的成员属性的使用方法
php静态成员方法和静态的成员属性的使用方法 静态成员方法和静态的成员属性 如下使用: class wan { public static $time = '1天'; public static function xxx() { echo '这就是一个静态的成员方法'; //在类的内部调用静态的成员属性的时候要使用self或者类名关键词,推荐在类的内部使用self echo self::$time; echo wan::$time; //在类的内部调用静态的成员方法的时候,也要使用self或者类
-
PHP静态成员变量和非静态成员变量详解
数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员
-
PHP 5.0对象模型深度探索之类的静态成员
静态属性包含在类中要封装的数据,可以由所有类的实例共享.实际上,除了属于一个固定的类并限制访问方式外,类的静态属性非常类似于函数的全局变量. 我们在下例中使用了一个静态属性Counter::$count.它属于Counter类,而不属于任何Counter的实例.你不能用this来引用它,但可以用self或其它有效的命名表达.在例子中,getCount方法返回self::$count,而不是Counter::$count. 静态方法则实现类需要封装的功能,与特定的对象无关. 静态方法非常类似于全局
-
PHP 5.0对象模型深度探索之对象复制
默认地,用__clone方法将建立一个与原对象拥有相同属性和方法的对象. 如果你想在克隆时改变默认的内容,你要在__clone中覆写(属性或方法). 克隆的方法可以没有参数,但它同时包含this和that指针(that指向被复制的对象).如果你选择克隆自己,你要小心复制任何你要你的对象包含的信息,从that到this,如果你用__clone来复制,PHP不会执行任何隐性的复制,下面显示了一个用系列序数来自动化对象的例子: 复制代码 代码如下: class ObjectTracker //对象跟踪
-
PHP 5.0对象模型深度探索之属性和方法
可以联用->,如果一个对象的属性包含了一个对象,你可以使用两个->运算符来得到内部对象的属性. 你甚至可以用双重引用的字符串来放置这些表达式. 下面的例子中,对象House中的属性room包含了一组Room对象. 访问方法和访问属性类似.->运算符用来指向实例的方法. 在下面的中调用getLastLogin就是.方法执行起来和类外的函数几乎相同. 如果一个类从另一类中继承而来,父类中的属性和方法将在子类中都有效,即使在子类中没有声明. 像以前提到过的,继承是非常强大的. 如果你想访问一个
-
PHP 5.0对象模型深度探索之绑定
除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 在计算机语言中有两种主要的绑定方式-静态绑定和动态绑定.静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息.它针对函数调用与函数的主体,或变量与内存中的区块.因为PHP是一种动态语言,它不使用静态绑定.但是可以模拟静态绑定. 动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息.在面向对象的
-
C++深度探索运算符重载和返回值优化
目录 问题背景 具体问题 测试代码 今天遇到的是内存释放错误的问题.原因是没写拷贝构造函数,奇怪的是我之前也没写确实能正常工作的,今天深究了一下发现是编译器做了返回值优化. 问题背景 编译环境还是针对C6455 DSP,为了做一些简单的图像直方图的处理,并且尽可能不用模板类,我自己写了一个简单的类用来存放带长度信息的数组,并且可以做一些简单的运算.重载了减法运算符,从而可以对两个直方图求差. 具体问题 当类中有那种需要动态分配空间的成员的时候,要记得提醒自己重载拷贝构造函数和赋值运算
-
PHP5.0对象模型探索之抽象方法和抽象类
面向对象程序通过类的分层结构构建起来,在单重继承语言如PHP中,类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类.当然,可能存在多个根类,用来实现不同的功能.在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用.如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作. 抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同-没有任何代码.如果类中存在一个或更多抽象方法, 那么
-
javascript prototype的深度探索不是原型继承那么简单第1/3页
1 什么是prototype JavaScript中对象的prototype属性,可以返回对象类型原型的引用.这是一个相当拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念. 前面我们说,对象的类(Class)和对象实例(Instance)之间是一种"创建"关系,因此我们把"类"看作是对象特征的模型化,而对象看作是类特征的具体化,或者说,类(Class)是对象的一个类型(Type).例如,在前面的例子中,p1和
-
不是原型继承那么简单!!prototype的深度探索
1 什么是prototype JavaScript中对象的prototype属性,可以返回对象类型原型的引用.这是一个相当拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念. 前面我们说,对象的类(Class)和对象实例(Instance)之间是一种"创建"关系,因此我们把"类"看作是对象特征的模型化,而对象看作是类特征的具体化,或者说,类(Class)是对象的一个类型(Type).例如,在前面的例子中,p1和
-
javascript克隆对象深度介绍
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内存中的地址. 克隆或者拷贝分为2种: 浅度克隆:基本类型为值传递,对象仍为引用传递. 深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改. 复制代码 代码如下: function cloneObject(obj){ var o = obj.c
-
python遍历文件夹,指定遍历深度与忽略目录的方法
背景 需要在文件夹中搜索某一文件,找到后返回此文件所在目录.用最常规的os.listdir()方式实现了一版,但执行时报错:递归超过最大深度.于是自己添加了点功能,之所有写此函数是为了让它适应不同的项目,因为有项目要找的文件在第一层,有的在第二层. 函数 功能:在文件夹中查找某一文件,找到后返回True与文件所在目录路径. 参数:filepath, 要查找的目录 参数:filename, 要查找的文件 扩展1:find_depth, 查找时指定递归深度: 扩展2:ignore_path, 查找时
随机推荐
- 用文字链接代替表单提交的按钮
- AngularJS基础 ng-keyup 指令简单示例
- Android:控件GridView的使用实例
- 使用Xcode为iOS应用项目创建PCH文件的方法及应用示例
- asp.net Urlrewriter在虚拟主机上的使用方法
- php数组中删除元素之重新索引的方法
- 解读PHP的Yii框架中请求与响应的处理流程
- Python实现程序的单一实例用法分析
- C语言结构体(struct)常见使用方法(细节问题)
- PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
- 使用cluster 将自己的Node服务器扩展为多线程服务器
- vs2010出现error MSB8008的解决方法
- MySql修改密码后phpMyAdmin无法登陆的解决方法
- 通过点击jqgrid表格弹出需要的表格数据
- yii2 RBAC使用DbManager实现后台权限判断的方法
- SpringMVC基于注解的Controller详解
- thinkPHP删除前弹出确认框的简单实现方法
- Docker SSH连接docker容器的示例代码
- 微信小程序使用progress组件实现显示进度功能【附源码下载】
- 快速解决ajax请求出错状态码为0的问题