4.1 静态方法和属性-深入PHP面向对象.模式与实践

摘自:深入PHP面向对象.模式与实践

第四章 高级特性
4.1 静态方法和属性
第2章的所有例子使用的都是对象.我们把类当作生成对象的模板,把对象作为活动组件,对象的方法可以被调用,对象的属性可以被访问.之前的例子也暗示了,面向对象编程中的实际操都是通过类的实例(而不是类本身)完成的.毕竟类仅仅是对象的模板.

事实并非如此简单.我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们.这样的方法和属性属性是"静态的"(static),必须用static关键字来声明.

class StaticExample{
static public $sNum = 0;
static public function sayHello) {
print "hello";
}
}

==========================================
注解:static关键字是在php5中引入的,在php4程序中不能使用.
==========================================

静态方法是以类作为作用域的函数.静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性.如果修改了一个静态属性,那么这个类的所有实例都能访问到这个新值.

因为是通过类而不是实例来访问静态元素,所以访问静态元素时不需要引用对象的变量,而是使用::(两个冒号)来连接类名和属性或类名和方法.

print StaticExample::$aNum;
StaticExample::sayHello();

在第3章中,我们已经熟悉了这个语法.我们曾使用::和parent来访问覆写的方法.现在和之前一样,只不过访问的是类而不是对象数据.一个子类可以使用parent关键字来访问父类,而不使用其类名.要从当前类(不是子类)中访问静态方法和属性,可以使用self关键字.self指向当前类,就像伪变量 $this指向当前对象一样.因此,在StaticExample类的外部可以使用其类名访问属性$aNum属性:

StaticExample::$aNum;

而在StaticExample类内部,可以使用self关键字:

class StaticExample {
static public $aNum = 0;
static public function sayHello() {
self::$aNum++;
printf "hello(" . self::$aNum . ")\n";
}
}

根据定义,我们不能在对象中调用静态方法,因此不能在静态方法中使用伪变量$this.

那么,我们为什么要使用静态方法或属性呢?

因为静态元素有很多有用的特性.
1.首先,它们在代码中的任何地方都可用(前提假设你可以访问该类).也就是说,你不需要在对象间传递类的实例,也不需要将实例存放在全局变量中,就可以访问类中的方法.
2.其次,类的每个实例都可以访问类中定义的静态属性,所以你可以利用静态属性来设置值,该值可以被类的所有对象使用.
3.最后,不需要实例对象就能访问静态属性或方法,这样我们就不用为了获取一个简单的功能而实例化对象.

相关文章:http://blog.haohtml.com/archives/3851

Leave a Reply

Your email address will not be published.