PHP笔记:PHP类和对象之静态关键字static

2018年10月6日22:42:37PHP笔记:PHP类和对象之静态关键字static已关闭评论 886 次
摘要

php的类中,使用关键字static修饰的属性和方法被称为静态属性和静态方法,之所以被称为静态方法,是指该属性和方法只属于类本身,不会随着类的实例化而被“复制”到实例。同样,静态属性和静态方法也不可以通过操作符 -> 访问,只能通过类名::属性 和 类名::方法 的方式访问。

php的类中,使用关键字static修饰的属性和方法被称为静态属性和静态方法,之所以被称为静态方法,是指该属性和方法只属于类本身,不会随着类的实例化而被“复制”到实例。同样,静态属性和静态方法也不可以通过操作符 -> 访问,只能通过类名::属性 和 类名::方法 的方式访问。

例如以下代码:

class car {
public $brand = '';
public static $price = 0;
private static $speed = 0;
}
$c1 = new car;
$c1->brand = 'Toyota';
$c1->price = 100000; 
car::$price = 99999;
echo car::$price; // 99999
echo $c1->price ; // 100000
car::$speed = 240;//报错,Cannot access private property

在上述代码的第8行中,我们通过 对象-> 操作符访问了静态属性price并改变其数值,然而并没有报错,为什么呢?其实,使用->操作符是,php会默认你在访问普通属性,如果该属性不存在则新建之。这就是为什么第10行和11行返回值不同的原因。虽然属性名称一样,但一个是$c1的普通属性,一个是car类的静态属性。此处需要注意。

另外,使用双引号操作符是,变量需要带$;

在php的类中,由于静态方法不需要通过对象即可调用,所以,在静态方法中伪变量$this是不允许使用的,需要使用parent、self、static在内部调用属性或方法。

class car {
public $brand = '';
public static $price = 0;
public static $speed = 0;
protected static $discount = 0;
public static function speedUp(){
self::$speed += 1;
//static::$speed += 1;//与上一行等效
}
}
class toyota extends car{
public static function speedDown(){
parent::$speed -=1;
//static::$speed -=1; // 与上一行等效
}
}

在静态属性中,static和parent或self是完全等效的,但推荐使用parent或self,这样可以明确该类与被调用的属性或方法的关系,增加可读性。

 

avatar