1.5 方法修饰符

方法修饰符有:static、final、abstract

1.5.1 static【静态的】


  1. static修饰的属性叫静态属性、static修饰的方法叫静态方法
  2. 静态成员加载类的时候分配空间,程序执行完毕后销毁
  3. 静态成员在内存中就一份。
  4. 调用语法 类名::属性 类名::方法名()

<?php
class Person {
public static $add='北京'; // 修饰符之间没有顺序
static public function show() {
echo '这是一个静态的方法<br>';
}
}
echo Person::$add,'<br>'; //北京
Person::show(); //这是一个静态的方法

练习:统计在线人数

<?php
class Student {
private static $num=0; //静态变量,在内存中就一份
public function __construct() {
self::$num++; //self表示所在类的类名
}
public function __destruct() {
self::$num--;
}
public function show() {
echo '总人数是:'.self::$num,'<br>';
}
}
//测试
$stu1=new Student;
$stu2=new Student;
$stu3=new Student;
$stu2->show(); //总人数是:3
unset($stu2);
$stu3->show(); //总人数是:2

**注意:**self表示所在类的类名,使用self降低耦合性

静态成员也可以被继承

<?php
class Person {
public static $add='中国';
public static function show() {
echo '这是人类<br>';
}
}
//继承
class Student extends Person {
}
//测试
echo Student::$add,'<br>'; //中国 通过子类名称访问父类的静态成员
Student::show(); //这是人类

静态延时绑定

static表示当前对象所属的类

<?php
class Person {
public static $type='人类';
public function show1() {
//var_dump($this); //object(Student)#1 (0) { }
//echo self::$type,'<br>'; //人类
echo static::$type,'<br>'; //学生 延时绑定
}
}
class Student extends Person {
public static $type='学生';
public function show2() {
//var_dump($this); //object(Student)#1 (0) { }
//echo self::$type,'<br>'; //学生
echo static::$type,'<br>'; //学生
}
}
//测试
$obj=new Student();
$obj->show1();
$obj->show2();

小结:

1、static在内存中就一份,在类加载的时候分配空间

2、如果有多个修饰符,修饰符之间是没有顺序的

3、self表示所在类的类名

4、static表示当前对象所属的类

5、static有两个作用,第一表示静态的,第二表示类名

1.5.2 final【最终的】

final修饰的方法不能被重写

final修饰的类不能被继承

PHP-方法修饰符_抽象类

PHP-方法修饰符_多态_02

作用

1、如果一个类确定不被继承,一个方法确定不会被重写,用final修饰可以提高执行效率。

2、如果一个方法不允许被其他类重写,可以用final修饰。

1.5.3 abstract【抽象的】


  1. abstract修饰的方法是抽象方法,修饰的类是抽象类
  2. 只有方法的声明没有方法的实现称为抽象方法
  3. 一个类中只要有一个方法是抽象方法,这个类必须是抽象类。
  4. 抽象类的特点是不能被实例化
  5. 子类继承了抽象类,就必须重新实现父类的所有的抽象方法,否则不允许实例化
  6. 类中没有抽象方法也可以声明成抽象类,用来阻止类的实例化

例题

<?php
//抽象类
abstract class Person {
public abstract function setInfo(); //抽象方法
public function getInfo() {
echo '获取信息<br>';
}
}
//继承
class Student extends Person {
//重写实现父类的抽象方法
public function setInfo() {
echo '重新实现父类的抽象方法<br>';
}
}
//测试
$stu=new Student;
$stu->setInfo(); //重新实现父类的抽象方法
$stu->getInfo(); //获取信息

抽象类的作用:

1定义命名规范

PHP-方法修饰符_抽象方法_03

2、阻止实例化,如果一个类中所有的方法都是静态方法,这时候没有必要去实例化,可以通过abstract来阻止来的实例化。