php面向对象中static 关键字的使用
使用static关键字可以将类中的成员标识为静态的,既可 以用来标识成员属性,也可以用来标识成员方法。普通成员作为对象属性存在,以Person类为例,如果在Person中有一个"$conuntry = 'china'"的成员属性,任何一个Person类的对象都会拥有自己的一份$country属性,对象之间不会干扰。而static成员是作为整个类的属性存在,如果将$country属性使用static关键字标识,则不管通过Person类创建多少个对象(甚至可以是没有对象),这个static成员总是唯一存在的,在多个对象之间共享的。因为使用static标识的成员属性是属于类的,所以与对象实例和其他的类无关。类的静态属性非常类似于函数的全局变量。类中的静态成员是不需要对象而使用类名来直接访问的,格式如下所示:
类名::静态成员属性名;
类名::静态成员方法名()
在类中声明的成员方法中,也可以使用关键字"self"来访问其他静态成员。因为静态成员是属于类的,而不属于任何对象,所以你不能用$this来引用它,而在PHP中给我们提供 的self关键字,就是在类的成员用来代表本类的关键字。格式如下 所示;
self::静态成员属性名; //在类的成员方法中使用这种方式访问本类中的静态成员属性
self::静态成员方法名(); //在类的成员方法中使用这种方式访问本类中的静态成员方法
如果在类的外部访问类中的静态成员,可以使用对象引用和使用类名访问,但通常选择用类名来访问。如果在类内部的成员方法中访问其他的静态成员,通常使用self的形式去访问,最好不要直接使用类名称。在下面的例子中声明一个Myclass类,为了让类中的count属性可以在每个对象中共享,将其声明为static成员,用来统计通过Myclass类一共创建了多少对象。代码如下所示:
<?php
class Myclass{
static $count;
function __contruct(){
self::$count++;
}
static function getcount(){
}
static function gecount()
return self::$count;
}
}
Myclass::$count=0;
$myc1 = new Myclass();
$myc2 = new Myclass();
$myc3 = new Myclass();
echo Myclass::getCount();
echo $myc3->getCount();
上例的Myclass类中,在构造方法内部和成员方法getCount()的内部,都使用self访问本类中使用static标识为静态的属性count,并在类的外部使用类名访问类中的静态属性。可以看到同一个类中的静态成员在每个对象中共享,每创建一个对象静态属性count就自增1.用来统计实例化对象的次数。
另外在使用静态方法时需要注意,在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用才能访问,通常是使用$this完成的。而静态的方法在对象不存在的情况下也可以直接使用类名来访问,没有对象就没$this引用,没有了$this引用就不能访问类中的非静态成员,但是可以使用类名或self在非静态方法中访问静态成员。
页:
[1]