静态变量:
只存在于函数作用域的变量,在函数执行完成后,这种变量的值不会丢失。下一次调用这个函数时,这个变量仍然会记住原来的值。如:
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的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:
类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。
const:
是一个定义常量的关键字,在PHP中定义常量使用的是”define()”这个函数,但是在类里面定义常量使用的是”const”这个关键字,类似于C中的#define如果在程序中改变了它的值,那么会出现错误,用”const”修饰的成员属性的访问方式和”static”修饰的成员访问的方式差不多,也是使用”类名”,在方法里面使用”self”关键字。但是不用使用”$”符号,也不能使用对象来访问。
代码
<?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; 是不允许的
?>
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; 是不允许的
?>