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 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php使用文本统计访问量的方法
May 12 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
php操作redis命令及代码实例大全
Nov 19 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利用cookie实现访问次数统计代码
2011/05/19 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python新手实现2048小游戏
2015/03/31 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python读取word文本操作详解
2018/01/22 Python
flask session组件的使用示例
2018/12/25 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
广告学专业自荐信范文
2014/02/24 职场文书
企业文化标语大全
2014/06/10 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
地震捐款简报
2015/07/21 职场文书