<?php
class Person{
public static $name = 'Voyager';
public static function say(){
echo 'My name is ' . self::$name;
}
}
一、介绍
- 不需要实例化类可直接访问。
- 在内存中只有一份,为所有的实例共用。
- 访问速度比实例化访问快。
- 静态方法中不能访问非静态属性和方法(还未创建,速度快的原因)。
- 静态属性不能通过实例化的对象方式访问,但静态方法可以。
- 不能直接定义为变量或者方法,详见三。
- 定义后不被自动回收,详见四。
二、访问方式
访问静态属性
Person::$name;
$me = new Person();
echo $me::$name;
访问静态方法
Person::say();
$me = new Person();
$me::say();
$me = new Person();
$me->say();//php7说静态调用非静态方法将被弃用
三、初始化为一个不定值
为什么static要一个不定值呢?例如一个方法处理一批订单,需要一个随机数,或者当天开始时间戳。我们需要初始化一次,然后对这批订单处理都使用这一个值,但是下一批又不一样了。
<?php
class Person{
public static $age = 2018-1994;#正确
public static $number1 = self::$age; #错的
public static $number2 = mt_rand(18,24); #错的
public static $number3;
#正确
public static function init(){
if(!self::$number3){
self::$number3 = mt_rand(18,24);
}
}
#正确
public function __construct(){
if(!self::$number3){
self::$number3 = mt_rand(18,24);
}
}
}
// init
Person::init();
echo Person::$number3;
// __construct
$a = new Person();
$b = new Person();
echo $a::$number3;
echo '<br />';
echo $b::$number3;
四、方法中的static
<?php
function increment1(){
static $n = 0;
$n++;
echo $n;
}
increment1(); #1
increment1(); #2
increment1(); #3
//输出‘123’
function increment2(){
$n = 0;
$n++;
echo $n;
}
increment2(); #1
increment2(); #1
increment2(); #1
//输出‘111’