AD

PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定

静态变量的类型关键字是static。本文主要是学习php中静态属性和静态方法的使用方法和基本的示例以及延迟绑定

Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定。

1、静态变量 static variable

静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。也就是说,在下一次执行这个函数时,变量仍然会记得原来的值。要将某个变量定义为静态的,只需要在变量前加上static关键字即可。

function testing()
{
    static $a = 1;
    $a *= 2;
    echo $a."\n";
}
testing();
testing();
testing();
testing();
/**
 *    2
 *    4
 *    8
 *    16
 *    [Finished in 0.1s]
*/

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。

本例中 testing()函数在每次执行之后,都会在内部保存 $a 变量的值。在下一次 testing()函数被调用时,$a 的值就会恢复,然后 testing() 函数会将这个值乘以2,并打印。变量的初始默认值为1,这一赋值操作只会在变量第一次被初始化时发生。函数每次执行的过程中,这一操作不会被调用。

2、类中静态元素的使用

在类中 static 关键字有两种主要的用法,一种是用来定义静态成员,另一种是用来定义静态方法。声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。静态属性不可以由对象通过 -> 操作符来访问。在类的内部我们可以使用作用域限定操作符来访问不同层次作用域的变量。

2.1、静态属性

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。可以把静态变量看成是属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态属性只保留一个变量值,而这个变量值对所有的实例都有效,也就是说所有实例共享这一个属性。

复制代码 代码如下:

class MyObject
{
    public static $a = 0;
    function MyMethod()
    {
        self::$a += 2;
        echo self::$a . "\n";
    }
}
$instance1 = new MyObject();
$instance1 -> MyMethod();
$instance2 = new MyObject();
$instance2 -> MyMethod();
/**
 *
 * 2
 * 4
 * [Finished in 0.1s]
 *
 */

$this 指标是类的当前实例,是一个到主叫对象的引用。

self:: 表示的是类本身,使用 self:: 作用域限定符时必须在操作符后面加上 $ 符号,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。在扩展类中使用 self:: 作用域时, self 可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。

parent:: 在扩展类中,在基类的方法被重写的情况下,如果你要访问基类的方法,可以使用 parent::

static:: 使我们不再需要使用 self:: 和 parent:: 。当希望指向最终的实现功能的类时,就可以使用static,这个限定符会在代码执行之前立即计算出继承层次结构上最后那个类的成员。

2.3、静态方法

静态方法的规则和静态变量是相同的。使用static关键字可以将方法标记为静态方法,而通过类的名称 和 作用域限定操作符 (::)可以访问静态方法。

静态方法和非静态方法之间有一个很重要的区别:在调用静态方法时,我们不在需要拥有类的实例。

复制代码 代码如下:

class MyObjectBase
{
    static function MyMethod()
    {
        static::MyOtherMethod();
    }
    static function MyOtherMethod()
    {
        echo 'called from MyObject.';
    }
}
class MyExtendObject extends MyObjectBase
{
    static function MyOtherMethod()
    {
        echo 'called from MyExtendObject.';
    }
}
MyExtendObject::MyMethod();

上例代码会正确的调用MyExtendObject中的 MyOtherMethod 方法,输出 called from MyExtendObject. [Finished in 0.1s]。

如果某个方法中不包含$this 变量,那么这个方法就应该是静态方法。如果不需要类的实例,那么还应该使用静态类,这样可以免去实例化的工作。另外,在静态方法中是不能使用 $this 变量的,因为静态方法不属于某个特定的实例。

2.4、延迟绑定

static:: 使我们不再需要使用 self:: 和 parent:: 。当希望指向最终的实现功能的类时,就可以使用static,这个限定符会在代码执行之前立即计算出继承层次结构上最后那个类的成员。这一过程被称作延迟绑定。

3、总结

使用static关键字可以创建静态变量,同时还可以提供一个默认的初始化值。静态变量是经过修饰的函数变量,在某个函数执行完成之后,他的值仍保持不丢失。

static关键字还可以用在类中来修饰属性和方法。用在属性上时,它使属性不再为某个实例保存一个值,而是为整个类自身保存一个值,静态属性可以在成员间共享。

要访问静态方法可以用(::),它被称作作用域限定符。这个操作符的左边可以是一个类名或者某个预定义作用域,预定义作用域包括 self parent static。操作符的右边是一个静态方法、属性。

标签: PHP, 静态变量
分类: php实例
时间: 2014-11-05

相关文章

  1. PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类.对象接口.instanceof 和契约式编程

    面向对象程序设计(OOP)是一种计算机编程架构.OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成.OOP达到了软件工程的三个主要目标:重用性.灵活性和扩展性.为了实现整体运算,每个对象都能够 ...
  2. PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式

    设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程 ...
  3. PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间

    PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念. 命名空间概述 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重 ...
  4. PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception

    异常经常被用来处理一些在程序正常执行中遇到的各种类型的错误.比如做数据库链接时,你就要处理数据库连接失败的情况.使用异常可以提高我们程序的容错特性,从而使我们的应用程序更加的稳定和健壮. 使用异常 PHP5 增加了类似其 ...
  5. Javascript学习笔记二 之 变量

    上面描述了数据类型,学习完数据类型就不得不提到变量. 一.关于Javascript变量声明 在Javascript中,声明一个变量 var a=1; 也可以直接 a=1; 这两种表达是有区别的, 一个是当前作用域的局部变 ...
  6. JavaScript高级程序设计 事件学习笔记

    JavaScript高级程序设计 事件学习笔记,需要的朋友可以参考下. 第12章 事件 1.事件流 1.1事件冒泡(IE事件流) □事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深 ...
  7. DB2 UDB V8.1管理学习笔记(二)

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(二).表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便 ...
  8. jquery学习笔记二 实现可编辑的表格

    jquery学习笔记二 实现可编辑的表格,让表格可以自由的编辑. 实现可编辑的表格demo: 实例图: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...
  9. SQL学习笔记二 创建表.插入数据的语句

    SQL学习笔记二 创建表.插入数据的语句,需要的朋友可以参考下. 创建一个表T_Employee并插入若干数据 create table T_Employee(FNumber VARCHAR(20),FName VARC ...
  10. javascript学习笔记(二)数组和对象部分

    本文是学习笔记系列的第二篇,深入浅出的分别从javascript对象和数组两个部分介绍了相关知识,并附上详细示例,非常的实用,有需要的朋友可以参考下 javascript对象部分 一:基础部分 1.JavaScript ...
  11. 设计模式学习笔记(二)--Singleton单件模式

    这是我写模式设计的第二篇,首先来说说设计模式的分类. 基本的23种设计模式从目的上可分为三种: 1. 创建型(Creational)模式:负责对象创建. 2. 结构型(Structural)模式:处理类与对象间的组合,可 ...
  12. cmake 学习笔记(二)

    在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 一.简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A; ...
  13. PHP学习笔记(二):变量详解

    这篇文章主要介绍了PHP学习笔记(二):变量详解,本文讲解了PHP变量简介.变量数据类型.常用函数.变量声明方法等内容,需要的朋友可以参考下 一.PHP 变量简介 1.语法 //PHP是弱类型语言,变量类型由存储的值决定 ...
  14. JavaScript学习笔记(二) js对象

    JavaScript学习笔记(二) js对象学习,学习js的朋友可以参考下. 1.简单类型 javascript的简单类型包括 数字(Number).字符串(String).布尔值(Boolean).null值 和 un ...
  15. Ruby简洁学习笔记(二):类继承.属性.类变量

    这篇文章主要介绍了Ruby简洁学习笔记(二):类继承.属性.类变量,本文是个人学习总结第二篇,需要的朋友可以参考下 1.如何声明一个子类 class Treasure < Thing 这样Thing类中的属性nam ...
  16. 学习笔记 (二) 提高工作效率的缓冲区.窗口操作的键盘快捷命令

    <学习 GNU EMACS 第二版>学习笔记 (二) 提高工作效率的缓冲区.窗口操作的键盘快捷命令 对于经常敲代码的程序员来说,不得不把手从键盘切换到鼠标是一个比较低效的动作,而且这种切换常常会把思路打断,但 ...
  17. CI框架学习笔记(二) -入口文件index.php

    本文介绍的是CI框架的入口文件index.php的相关资料,需要的朋友可以参考下 上一节(CI框架学习笔记(一) - 环境安装.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为C ...
  18. Android学习笔记(二)App工程文件分析

    之前写过一篇关于安卓环境配置以及第一个app的制作过程,下面我们来进一步,分析下APP工程文件 App工程文件分析 关于如何创建一个最简单的Android App请参照链接: < Android学习笔记(一)环境安 ...
  19. javascript学习笔记(二十) 获得和设置元素的特性(属性)

    javascript学习笔记之获得和设置元素的特性(属性)介绍,学习js的朋友可以参考下 本节html以下面的为例 <div id="myDiv" class="bd" ti ...