欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

抽象类与接口、后期静态绑定与魔术方法简单总结

程序员文章站 2022-03-13 12:33:53
...

抽象类与接口、后期静态绑定与魔术方法简单总结

抽象类

抽象类:设计类与实现类是分离的,抽象类可以给子类提供一些公用的方法,作为子类的重写模板来使用

  • 抽象类也是多态的一种,抽象类只对方法跟类做一个大概的描述,但是没有具体的实现
  • 抽象类跟方法使用 abstract 关键字声明,抽象方法可以是静态方法
  • 抽象类不可被实例化,无法生成对象
  • 使用抽象类,需要继承抽象类后把里面的抽象方法全部重写,如果没有全部重写,那么该继承的子类也还是抽象类
  • 抽象类中可以存在普通属性跟普通方法
  • 抽象类中可以使用构造函数
  1. abstract class Father{
  2. public $name;
  3. abstract public function eat();
  4. public function say(){
  5. return "my name is {$this->name}";
  6. }
  7. public function __construct($n)
  8. {
  9. $this->name=$n;
  10. }
  11. }
  12. class Son extends Father{
  13. //重写eat方法
  14. public function eat(){
  15. return "I'm eating";
  16. }
  17. }
  18. $obj = new Son("admin");
  19. echo $obj->say();
  20. echo '<hr>';
  21. echo $obj->eat();
  22. echo '<hr>';
  23. echo $obj->name;

接口

在类里面,不管是普通类还是抽象类都是单继承,即一个子类只能继承一个父类,但是实际开发中,我们会需要一个子类继承多个父类,这种情况下就可以使用接口来实现,接口也是多态的一种。

  • 接口使用 interface 关键字替换掉 class 关键字来创建
  • 接口中,只允许声明两个成员:1.类常量,2 抽象方法

    类常量

    • 类常量使用 const 关键字声明
    • 关键字后面直接跟常量名称不需要加$符
    • 一般默认所有字母大写
    • 类常量的值不允许更改
    • 类常量会默认为静态成员
      >
  • 接口中的抽象方法也可以是静态方法
  • 重写接口中的静态方法时,也必须按照静态重写
  • 接口中的抽象方法不带 abstract 关键字
  • 子类使用接口使用 implements 关键字
  • 一个子类同时使用多个接口,多个接口之间用英文逗号,隔开
  1. interface Father{
  2. const NAME = 'admin';
  3. public static function eat($name);
  4. }
  5. class Son implements Father{
  6. public static function eat($name){
  7. return "I'm eating".$name.self::NAME;
  8. }
  9. }
  10. // $obj = new Son();
  11. echo Son::eat('php&');
  12. echo '<hr>';

后期静态绑定

在普通类与普通方法中,可以使用$this将属性或方法与当前实例化的类绑定,但是静态方法的self只能与当前所在的类绑定,如果想要实现与普通方法中$this 相同的效果,就需要用到后期静态绑定也叫延迟静态绑定,使用 static 关键字调用

  1. class Father{
  2. public function demo(){
  3. return "Father 下的demo方法";
  4. }
  5. public function test(){
  6. return $this->demo();
  7. }
  8. }
  9. class Child extends Father{
  10. public function demo(){
  11. return "Child 下的demo方法";
  12. }
  13. }
  14. $father = new Father();
  15. $child = new Child();
  16. echo $father->test();
  17. echo '<hr>';
  18. echo $child->test();
  19. echo '<hr>';
  20. echo '后期静态绑定';
  21. echo '<hr>';
  22. class Father1{
  23. public static function demo(){
  24. return "Father 下的demo方法";
  25. }
  26. public function test(){
  27. return static::demo();
  28. }
  29. }
  30. class Child1 extends Father1{
  31. public static function demo(){
  32. return "Child 下的demo方法";
  33. }
  34. }
  35. $father1 = new Father1();
  36. $child1 = new Child1();
  37. echo $father1->test();
  38. echo '<hr>';
  39. echo $child1->test();

常用魔术方法

  • __construct()构造方法:在实例化一个类的时候自动调用
  • __destruct()析构方法:在类执行完或者销毁时自动调用
  • __call(函数名,函数参数):在对象中调用一个不可访问的方法时自动调用
  • __callStatic(函数名,函数参数):调用一个类里面不可访问的静态方法时自动调用
  • __get():在调用一个类里面不可访问的属性时自动调用
  1. class Father{
  2. public $name = 'admin';
  3. protected $age = 18;
  4. public function __get($param){
  5. if(!empty($this->$param)){
  6. return '您访问的属性是:'.$param.'值是:'.$this->$param;
  7. }else{
  8. return "参数不存在";
  9. }
  10. }
  11. public function __set($param,$values){
  12. if(!empty($this->$param)){
  13. echo '您要修改的属性是:'.$param.'值改为了:'.$values;
  14. return $this->$param = $values;
  15. }else{
  16. echo "参数不存在";
  17. }
  18. }
  19. }
  20. $obj = new Father();
  21. echo $obj->age;
  22. echo '<hr>';
  23. $obj->age = 28;