PHP面向对象之方法修饰符 (static final abstract)

方法修饰符

  • 方法修饰符有
    • static
    • final
    • abstract

static 静态的

  • 概念

    • static修饰的属性叫静态属性
    • static修饰的方法叫静态方法
    • 静态成员加载类的时候分配空间,程序执行完毕后销毁
    • 静态成员在内存中就一份
  • 调用语法

    • 类名::属性 类名::方法名()
<?php 
class Person {
	public static $add='北京';    // 修饰符之间没有顺序
	static public function show() {
		echo '这是一个静态的方法<br>';
	}
}
echo Person::$add,'<br>';		//北京
Person::show();					    //这是一个静态的方法
?> 
  • 调用语法
    • self表示所在类的类名
    • 使用self降低耦合性
<?php 
class Student {
	private static $num=0;	
	public function __construct() {
		self::$num++;      
	}
	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
?> 
  • 通过子类名称访问父类的静态成员
    • 静态成员也可以被继承
<?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() {
		echo self::$type,'<br>';	      //人类
		echo static::$type,'<br>';		  //学生   延时绑定
	}
}
class Student extends Person {
	public static $type='学生';
	public function show2() {
		echo self::$type,'<br>';	    //学生
		echo static::$type,'<br>';	  //学生
	}
}
//测试
$obj= new Student();
$obj->show1();
echo '<br>';
$obj->show2();
?> 
  • 小结
    • static在内存中就一份,在类加载的时候分配空间
    • 如果有多个修饰符,修饰符之间是没有顺序的
    • self表示所在类的类名
    • static表示当前对象所属的类名
    • static有两个作用,第一表示静态的,第二表示类名

final 最终的

  • 语法

    • final修饰的方法不能被重写
    • final修饰的类不能被继承
  • 作用

    • 如果一个类确定不被继承,一个方法确定不会被重写,用final修饰可以提高执行效率
    • 如果一个方法不允许被其他类重写,可以用final修饰

abstract 抽象的

  • 概念

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

    • 定义命名规范
    • 阻止实例化
      • 如果一个类中所有的方法都是静态方法,这时候没有必要去实例化
      • 可以通过abstract来阻止来的实例化
<?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();		//获取信息
?> 
posted @ 2020-12-10 20:07  wing1377  阅读(205)  评论(0编辑  收藏  举报