静态(static)
在类中也有类似函数的静态变量之类的东西,(函数中:不被重复定义,函数的多次调用共有一个静态变量)使用静态修饰的表示该属性或者方法属于类,不会因为对象的实例化而改变其本身的内容。
语法:
1.静态属性: 访问修饰限定符 static 属性名字
2.静态方法: 访问修饰限定符 static function 方法名字(){}
静态访问: 类::静态属性或者静态方法
静态属性demo:
//假如有这样一个需求:当类创建一个对象时,使用一个计数器将对象的数量给记录下来,也就是说统计你一共创建了几个对象 见以下代码: //静态 class Person { //属性 public $name; private $age; //静态属性 public static $count = 0; //方法 public function __construct($name,$age){ //初始化 $this->name = $name; $this->age = $age; //计数器 self::$count++; } } //创建一个对象 $person1 = new Person('萧峰',30); echo Person::$count; //访问类内的静态属性$count 输出: 1 //Person::$count = 10; //可以从外部修改类的内部数据(不安全) $person2 = new Person('慕容复',28); echo Person::$count; //输出: 2 //这样就满足了一共创建了多少个对象这样的需求。 //注意:无论是类的内部还是类的外部访问静态属性的时候 属性名字都必须加上$符号(Person::$count) 如果是这样写Person::count,表示的是访问一个常量
由于上面的静态属性$count是public 在类的外部可以修改 所以下面我们将$count定义成private,在类的内部定义一个公共静态方法来实现一共创建了多少个对象
静态方法demo:
//静态 class Person { //属性 public $name; private $age; //静态属性 private static $count = 0; //方法 public function __construct($name,$age) { //初始化 $this->name = $name; $this->age = $age; //计数器 self::$count++; } //定义一个静态方法,来获取对象数量 public static function getCount() { //返回当前计数器的值 return self::$count; } } //实例化 $person1 = new Person('萧峰',30); $person2 = new Person('慕容复',28); //echo Person::getCount(); //类访问静态方法 echo $person2->getCount(); //可以,对象也可以访问静态的方法 输出:2 (因为创建了两次对象) //echo $person2->count; //不可以 //这样既实现了统计一共创建了多少个对象的需求,也让类内部定义的静态属性$count不能在类的外部被修改(恶意修改)
静态与非静态的区别
1、设置出发点:静态是给类使用,非静态是给对象使用
2、对象不能访问静态属性(对象访问属性只会去对象的内存区域(堆)找,而静态属性在内存中的代码区),对象能够访问静态方法(静态方法和普通方法都在内存区域中的代码区里),也就是说静态方法只能访问静态属性,不能访问非静态属性(普通属性,没有static)
3、普通的成员方法可以访问静态属性和非静态属性
4、类能够访问普通方法(前提是 方法里面没有使用$this),类不能访问普通属性(属性是在对象空间里,也就是内存中的堆中)
5、如果我们的是静态方法或静态属性是protected或者是private 则也不能在类的外部使用
6、在类的外部调用静态方法:类名::静态方法名(推荐使用) 或者 对象名->静态方法名 或者 对象名::静态方法(这两种是语法支持,但是不推荐)
7、在类的内部调用静态方法:self::静态方法名 或者 类名::静态方法名,通过 $this也可以
代码案例如下:
<?php //定义一个类 class Person { //属性 public $name; private $age; //静态属性 public static $count = 0; //普通方法 public function setAge($age) { $this->age = $age; } public function test() { echo 'hello world'; } } //实例化 $person = new Person('白眉鹰王',58); //省略对象访问 //类访问非静态属性和方法 //属性访问 Person::$count; //可以,因为$count是静态属性,就在代码区中 //Person::$name; //不可以,$name是普通属性,存在 在堆里,类找不到 //方法访问 Person::test(); //可以,但是因为test方法不是静态方法,本身不是为类存在的,所以会有一个类似警告的提示 Person::setAge(20); //不可以,因为setAge方法内部使用了$this 而$this代表当前对象 但是 此时不是对象在访问setAge,所以会报错
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论