在类中除了有普通的成员(普通的属性和普通的方法),还有静态的成员(静态属性和静态方法)
先看下面的代码:
<?php
class Book
{
//使用static关键字声明成员是静态的
private static $sum = 0;
public function showme()
{
//访问静态成员,必须使用self关键字和 :: 操作符
self::$sum++;
printf('你是第%d位访客<br/>', self::$sum);
}
}
//第一次实例化对象
$b1 = new Book();
$b1->showme();
//第二次实例化对象
$b2 = new Book();
$b2->showme();
//第三次实例化对象
$b3 = new Book();
$b3->showme();
输出结果如下:
如果使用普通的成员变量,会是什么结果呢?
<?php
class Book
{
private $sum = 0;
public function showme()
{
$this->sum++;
printf('你是第%d位访客<br/>', $this->sum);
}
}
//第一次实例化对象
$b1 = new Book();
$b1->showme();
//第二次实例化对象
$b2 = new Book();
$b2->showme();
//第三次实例化对象
$b3 = new Book();
$b3->showme();
运行结果如下:
通过比对运行结果,我们会发现两者有明显的区别。我们来总结静态变量的特点。
静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区,该 区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),直到整个程序运行结束。
除了有静态的属性,还有静态方法。见下面 例子:
<?php
class Person
{
static function tellAge()
{
static $age = 0;
$age++;
echo "The age is: $age<br>";
}
}
echo Person::tellAge(); //output 'The age is: 1'
echo Person::tellAge(); //output 'The age is: 2'
echo Person::tellAge(); //output 'The age is: 3'
echo Person::tellAge(); //output 'The age is: 4'
在类的外部访问静态成员时,必须使用类名和扣操作符 :: ,而不需要创建对象