面向对象 - 静态属性和方法 ¶
作者:KK
发表日期:2017.3.15
静态属性 ¶
静态属性可以不用new这个类就可以直接调用
在定义属性的时候,属性名称前面加一个static
关键字就就成了静态属性
class User{
public static $name = 'Jay';
}
echo User::$name; //不用new
相反,其实没有static修饰的非静态属性,我们又可以叫它们做“动态属性”
静态方法 ¶
静态方法也可以不用new这个类就直接调用,在函数名前面加static
class User{
public static function say(){
echo 'Hello!';
}
}
echo User::say();
静态方法里不能用$this
¶
class User{
public $name = 'Jay';
public static function say(){
echo $this->name; // 报错
}
}
echo User::say();
不要乱用静态 ¶
首先在非静态模式下,每个实例变量能各自将数据区分开来:
class User{
public $name;
public function __construct($name){
$this->name = $name;
}
}
$a = new User('Jay');
$b = new User('Marie');
//两个实例变量的name值都不同
print_r([
$a->name,
$b->name
]);
如果用静态的方式就不好区分两个不同的用户了:
class User{
public static $name;
}
User::$name = 'Jay';
User::$name = 'Marie'; // 覆盖了Jay这个值
echo User::$name; //Marie
结果当然是输出了“Marie”
不过静态特性也是有它的好处的,只是真正意义上并不会很常用,先了解了解就好,在未来累积较多的编程经验后再讲讲如何使用静态和动态吧
访问自身的静态属性 ¶
class User{
public static $name = 'Jay';
public static function hi(){
echo self::$name; //通过 self关键字 + :: + 属性变量名 来访问
}
}
User::hi();
尽管是protected还是private作用域的属性都能访问
访问自身的静态方法 ¶
class User{
public static function name(){
return 'Jay';
}
public static function hi(){
echo self::name(); //通过 self关键字 + :: + 方法名 来访问
}
}
User::hi();
protected还是private作用域的方法都能访问