PHP OPP 和模式 (2) - 静态变量、属性和方法及延迟绑定

PHP高级程序设计 学习笔记 2014.06.10

本文讨论static关键字,他可以用在变量、类和方法上。

1、静态变量

静态变量是只存在于函数作用域的变量,不过,在函数执行完成以后,这种变量的值不会丢失,也就是说,在下一次执行这个函数时,变量仍然会记得原来的值。要将某个变量定义为静态的,只需要在变量前加上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、静态属性

静态属性是一种类变量,可以把他看成是属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态属性只保留一个变量值,而这个变量值对所有的实例都有效,也就是说所有实例共享这一个属性。


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。操作符的右边是一个静态方法、属性。

时间: 2025-01-12 13:59:05

PHP OPP 和模式 (2) - 静态变量、属性和方法及延迟绑定的相关文章

PHP 面向对象编程和设计模式 (2/5) - 静态变量、属性和方法及延迟绑定追嘴坠缀自壮

http://www.ebay.com/cln/77f_flrb/2015-01-29/166649677018 http://www.ebay.com/cln/7lh_nprn/2015-01-29/166579847017 http://www.ebay.com/cln/ttb_vbnb/2015-01-29/166693228012 http://www.ebay.com/cln/fzf_bblf/2015-01-29/166841922013 http://www.ebay.com/cl

Python的实例定属性和方法或类绑定方法

一.给实例对象绑定属性和方法:1.给实例绑定属性:先定义一个Student类 #!/usr/bin/python class Student(object): pass 然后绑定属性: s = Student() s.name = 'AAA' # 动态给实例绑定一个属性 print(s.name)#输出AAA 2.给实例绑定方法:先定义一个方法 def add(self,a,b): self.a = a self.b = b return self.a +self.b 然后绑定方法: Metho

MVC - php静态变量, 成员和方法

总结下,使用静态成员是为了保证在脚本周期里不被重新初始化,因此避免对类进行实例化而是用类名直接调用或者访问(第一次调用或者访问的时候生成单例对象,再调用的时候直接返回这个单例对象). 在MVC中常被用作以工厂模式生成表Model类单例对象,工厂类中设置一个static $list数组成员保存所有生成的表Model单例.如下Factory.class.php(Factory类会自动加载): class Factory{     public static function M($class_nam

php中static静态变量的使用方法详解

php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. 看看下面的实例: 复制代码 代码如下: <?php function Test() { $w3sky = 0; echo $w3sky; $w3sky++; } ?> 本函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0".将变量加一的 $w3sky++ 没有其到效果,因为一旦退出

FlashBuilder 4.6 Bug 代码提示无法显示 变量属性和方法

用FlashBuilder4.6 创建Flex 项目,如果在Application中用 fx:Metadata 添加元数据,然后又注释掉(使用单行//或多行/* */注释),FlashBuilder4.6的代码提示就会出现异常,无法再显示变量的属性.方法,无法按Ctrl+1自动添加函数体.事件处理函数.仅能再显示 类.包的提示. 所以不要再FlashBuilder4.6 的Flex项目中写如下代码 <fx:Metadata> // ---- </fx:Metadata> 或是 &l

面向对象static静态的属性和方法的调用

<?php header("content-type:text/html;charset=utf-8"); class Human{ static public $name = "小妹"; public $height = 180; static public function tell(){ echo self::$name;//静态方法调用静态属性,使用self关键词 //echo $this->height;//错.静态方法不能调用非静态属性 //

静态变量 常量 和方法

1.在静态方法中不可以使用this关键字 2.在静态方法中不可以直接调用非静态方法 如果在执行类,希望先执行类的初始化动作,可以使用static定义一个静态区域.如: 1 class example{ 2 static{ 3 //some 4 } 5 } 主方法的形参为数组,其中args[0]~args[n]分别代表程序的第一个参数到n个参数,可以使用arg.length获取参数的个数. 1 public static void main(String[] args) { 2 //args.le

Javascript的私有变量和方法、共有变量和方法以及特权方法、构造器、静态共有属性和静态共有方法

一.私有变量:定义在函数内部的属性和方法称之为该函数的私有属性和方法        共有变量:在函数内部通过this创建的对象和方法称之为该函数的共有属性和方法 特权方法:通过this创建的既可以访问该函数的共有属性和方法,也可以访问该函数的私有属性和方法称之为特权方法 构造器:对象在创建的时候调用特权方法来初始化实例的属性,这个方法也称为构造器 /** * 类的内部私有属性.私有方法.特权方法.共有属性和共有方法以及构造器 * @param id * @param bookname * @pa

PHP 的 返回引用(方法名前加&) 和 局部静态变量(static)

先阅读手册==========从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & : 例子 17-13. 由函数返回一个引用 <?php   function &returns_reference()   {       $someref = 0;       return $someref;   }      $newref = &returns_reference();//相当于 $newref = &$someref;   ?>