面向对象 - 静态属性和方法

  • 作者: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作用域的方法都能访问