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


Posted in PHP onJune 12, 2014

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 开发环境配置(测试开发环境)
Apr 28 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP中ini_set和ini_get函数的用法小结
Feb 18 PHP
php中in_array函数用法分析
Nov 15 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
php微信开发之百度天气预报
Nov 18 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 #PHP
对PHP语言认识上需要避免的10大误区
Jun 12 #PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 #PHP
PHP微框架Dispatch简介
Jun 12 #PHP
PHP资源管理框架Assetic简介
Jun 12 #PHP
探寻PHP脚本不报错的原因
Jun 12 #PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 #PHP
You might like
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
Python对象与引用的介绍
2019/01/24 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
有原因的手表:Flex Watches
2019/03/23 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
企业文化口号
2014/06/12 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python