博客列表 >PHP基础:类的封装和继承

PHP基础:类的封装和继承

初见
初见原创
2021年10月21日 10:31:02600浏览

类的封装与继承

  • 封装
  1. //类包括成员属性和成员方法
  2. //访问修饰符:
  3. // public 公用的 内部 子类 外部
  4. // protected 受保护的 内 部 子类 可以继承
  5. // private 私有的 内 部
  6. // OPP面向对象开发,三大特性:封装 继承 多态
  7. class Teacher
  8. {
  9. // 成员属性
  10. public $name;
  11. public $age;
  12. public $gender;
  13. protected $salary;
  14. private $former;
  15. //构造方法 给与重新赋值
  16. public function __construct($name,$age=18,$gender=1,$salary=3000,$former=0)
  17. {
  18. $this->name=$name;
  19. $this->age=$age;
  20. $this->gender=$gender;
  21. $this->salary=$salary;
  22. $this->former=$former;
  23. }
  24. // 成员方法
  25. public function info(){
  26. return "我的名字:{$this->name},年龄:{$this->age},工资:{$this->salary},对象:{$this->former}";
  27. // 受保护的或私有的可以在共有的方法里调用,用this
  28. // return $this->jiaoan();
  29. // return $this->silu();
  30. }
  31. public function code(){
  32. return '我会写代码';
  33. }
  34. public function teaching(){
  35. }
  36. //受保护的 不能在外部访问
  37. protected function jiaoan(){
  38. return '我写的教案';
  39. }
  40. private function silu(){
  41. return '这是我的教学思路';
  42. }
  43. }
  44. $obj = new Teacher('xiaoming');
  45. echo $obj ->name; //xiaoming 共有的直接访问
  46. echo '<hr>';
  47. //echo $obj ->salay; //受保护的,报错
  48. //echo $obj ->former; 私有的,也无法直接访问
  49. echo $obj ->code();//我会写代码
  50. echo '<hr>';
  51. echo $obj ->info(); // 我的名字:xiaoming,年龄:18,工资:3000,对象:0
  52. echo '<hr>';
  • 继承
  1. class Boy extends teacher{
  2. //子类继承父类,可以直接使用父类的功能 extends
  3. public function get_tea(){
  4. return '父类工资:' . $this->salary;
  5. }
  6. }
  7. //继承 只能继承公共的和受保护的,不能继承私有的
  8. $obj = new Boy('花花');
  9. //echo $obj ->former; 私有无法继承
  10. //echo $obj ->salay; 受保护的不能在外部调用
  11. echo $obj ->get_tea(); //父类工资:3000 受保护的可以在子类调用
  • 自动加载
  1. <?php
  2. // 自动加载 spl_autoload_register 文件名和类名保持一致
  3. spl_autoload_register(function ($className){
  4. require_once $className . '.php';
  5. });

类的重写和静态成员

  • 类重写
  1. //只能有一个父类,但是可以有多个子类
  2. class Girl extends Teacher{
  3. // 类重新(方法重写)
  4. //和父类方法名冲突,会覆盖父类
  5. // public function info(){
  6. // return "my name is:{$this->name}";
  7. // }
  8. // 属性可以和构造方法一起重写,属性单独无法重新
  9. public $name;
  10. public function __construct($name)
  11. {
  12. $this->name=$name;
  13. }
  14. //调用父类info() , parent::
  15. public function info(){
  16. return parent::info() . 'Girl调用父类的info';
  17. }
  18. }
  • 父类禁止重写
  1. // 父类禁止重写final
  2. final public function info(){
  3. return "我的名字:{$this->name},年龄:{$this->age},工资:{$this->salary},对象:{$this->former}";
  4. }
  5. // 子类只能改名来调用父类
  6. public function info_s(){
  7. return parent::info() . 'Girl调用父类的info';
  8. }
  • 禁止继承
  1. final class Teacher{
  2. }
  3. 该类禁止继承
  • 静态成员
  1. <?php
  2. //静态成员可以给变量也可以给方法
  3. class Shop{
  4. public static $title='苹果13PRO';
  5. public $price;
  6. public $num1=1;
  7. public static $num2=1;
  8. //构造 给与静态成员默认值会报错
  9. //使用静态成员没有经过构造方法
  10. public function __construct($title,$price)
  11. {
  12. $this->title =$title;
  13. $this->price =$price;
  14. // 普通成员变量,每次从头开始计算
  15. $this->num1++;
  16. // 静态变量成员调用一次,就会增加1
  17. // 静态成员为本类调用,为所有实例共享
  18. // 存在内存中,只要使用了改变了它的值,它会在内存中保存改变后的数据
  19. self::$num2++;
  20. }
  21. public static function vedio(){
  22. // 静态成员用self 代表本类 Shop, 普通方法用$this
  23. return '看视频手机:'. self::$title;
  24. }
  25. }
  26. //如果属性和方法是静态的不要使用原始的访问方法,防止浪费资源
  27. //静态成员访问方式使用 类名::属性名 方法 类名::方法名
  28. echo Shop::$title; //默认给值后,返回 苹果13PRO
  29. echo '<hr>';
  30. //不实例没有对象情况下也可以使用静态成员
  31. Shop::$title='苹果 14 PRO';//也可以外面给与默认值
  32. echo Shop::$title;
  33. echo '<hr>';
  34. echo Shop::vedio();
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议