您的位置:首页 > 编程语言 > PHP开发

PHP基础知识系列:静态

2012-09-08 15:43 1376 查看
静态变量:

  只存在于函数作用域的变量,在函数执行完成后,这种变量的值不会丢失。下一次调用这个函数时,这个变量仍然会记住原来的值。如:

function testing(){
  static $a = 1;
  $a  *= 2;
  echo $a . "\n";
}

testing();//2
testing();//4
testing();//8


静态成员:

  是一种类变量,可以把它看成是属于整个类而不是属于类的实例。所有的实例成员都共享这个成员。

class MyObject{
public static $myStaticVar = 0;

function myMethod(){
self::myStaticVar  += 2;
echo self::myStaticVar  . "\n";
}
}
$instance1 = new MyObject();
$instance1->myMethod();//2
$instance2 = new MyObject();
$instance2->myMethod();//4


这里使用的是self::作用域限定符,而不用$this。因为self::表示类,而$this表示的是实例。

::这个操作符,左边表示的是作用域,右边表示的是访问成员。可以使用系统定义的作用域:self和parent。

self::可以调用基类中声明的方法,但是它调用的总是已经在扩展中重写的方法。如下:

class MyObject  {
  public static $myVar = 0;

  function myMethod()  {
    self::$myVar+=2;
    echo self::$myVar . "/n";
  }
}

class MyOtherObject extends MyObject  {
  function myMethod()  {
    echo "基类myMethod被重写";
  }

  static  function myOtherMethod()  {
    echo "myExtendsedMethod" . "/n";
    self::myMethod(); //在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法.
    parent::myMethod();//如果基类的方法被重写的情况下,你希望调用定义在基类的方法,可以使用parent作用域.
    parent::myMethod();//静态成员
  }
}

MyOtherObject::myOtherMethod();


静态方法不在需要实例化类。

static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护
  从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:

代码

<?php
class MyClass
{

//定义一个常量constant
const constant = 'constant value';

function showConstant() {
echo self::constant . "\n"; //使用self访问,不要加”$”
}
}

echo MyClass::constant . "\n"; //使用类名来访问,也不加”$”

$class = new MyClass();
$class->showConstant();
// echo $class::constant; 是不允许的

?>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: