博客列表 >面向对象 oop 与类的进阶

面向对象 oop 与类的进阶

超超多喝水
超超多喝水原创
2021年10月24日 16:37:49556浏览

面向对象 oop 与类的进阶

  • 面向对象 oop
    面向过程是从上往下的,跟随的是代码的顺序,面相对象是从下往上的,有了对象往上去找写好的类
  • 类与文件的命名
    一般我们默认类名与文件名一致,每个类要分配一个文件
  • 访问修饰符
    访问修饰符除 public 外还有 protected 与 private 两种,且不仅可以用在变量,还可以用在方法
    • public 共有的,都能访问
    • protected 受保护的,只能在本类或子类中访问
    • private 私有的,只能在本类中访问
  • 构造方法__construct()
  1. class Father{
  2. //可继承
  3. public $name = 'admin';
  4. protected $gender = 'male';
  5. //不可继承
  6. private $age = 18;
  7. public function __construct($n,$g,$a)
  8. {
  9. //在构造函数内都可赋值
  10. $this->name=$n;
  11. $this->gender=$g;
  12. $this->age=$a;
  13. }
  14. public function info(){
  15. //在本类方法内调用
  16. return "father-uname:{$this->name},father-gender:{$this->gender},father-age:{$this->age}";
  17. }
  18. }
  19. class Son extends Father{
  20. //由于父类的$age无法继承过来,我们给子类重新加一个$son_age
  21. private $son_age = 18;
  22. //构造方法重写
  23. public function __construct($n,$g,$a)
  24. {
  25. $this->name=$n;
  26. $this->gender=$g;
  27. $this->son_age=$a;
  28. }
  29. //普通方法重写
  30. public function info(){
  31. //由于父类的$age无法继承过来,我们给子类重新加一个$son_age
  32. return "son-uname:{$this->name},son-gender:{$this->gender},son-age:{$this->son_age}";
  33. }
  34. }
  35. $father = new Father('admin1','male',28);
  36. echo $father->name;
  37. echo '<hr>';
  38. echo $father->info();
  39. echo '<hr>';
  40. echo '<hr>';
  41. $son = new Son('admin','male',18);
  42. echo $son->name;
  43. echo '<hr>';
  44. echo $son->info();

构造方法除了可以给共有变量重新赋值,也可以给受保护的活私有变量重新赋值

  • 类的继承 extends
    • 子类去继承父类的变量、功能,可以简化代码,父类有的变量跟功能方法就可以省略,但是只有 public 跟 protected 修饰符的两种变量或方法可以继承,private 修饰符的变量或方法无法继承
    • 子类继承过来父类的变量跟方法,是可以进行重写的
    • 子类继承过来的父类的方法重写时,如果需要用到父类的方法可以使用 parent 关键字来调用
    • 如果父类的方法不允许被子类重写,可以在方法前面加上 final 关键字,禁止被子类重写
    • 如果一个类不想能被继承,也可以在类的前面加上 final 关键字,禁止被继承
  1. //禁止父类被继承
  2. final class Father{
  3. public $name = 'admin';
  4. //禁止方法被重写
  5. final public function uname(){
  6. echo 'admin222';
  7. }
  8. }
  • 类的自动加载 spl_autoload_register()
    使用 spl_autoload_register()函数可以实现类的自动加载,在函数内写一个引入 php 文件的匿名函数,当 new 一个类时就会自动去找相关文件。
  1. spl_autoload_register(
  2. function($classname){
  3. require_once $className .'php';
  4. }
  5. );
  • 静态成员
    • 静态成员使用 static 关键字声明,可以给属性,也可以给方法
    • 静态成员的调用不用实例化对象就可以调用
    • 静态成员调用的方法是类名+::+属性或方法
    • 静态成员由本类调用,为所有实例所共享
    • 获取本类静态成员使用的关键词是 self,self::$username,类似于普通属性调用中的$this
    • 普通成员使用后就会销毁,但是静态成员会一直存在于内存中
    • 静态成员优点:
      1. 当存在多个实例时,静态成员在内存中只占一份
      2. 静态成员执行效率比实例化要高
    • 静态成员缺点:
      静态成员不能自动销毁,而实例化的普通成员在代码结束后就会销毁
  1. class Father{
  2. public $name;
  3. static $uname = '静态admin';
  4. public $num1 = 1;
  5. static $num2 = 1;
  6. public function add1(){
  7. $this->num1++;
  8. self::$num2++;
  9. return '通过计数查看静态成员为所有实例共享,我是普通成员的数字'.$this->num1.',我是静态成员的数字'.self::$num2;
  10. }
  11. public function add2(){
  12. //静态属性无法销毁,如果想做到与普通属性一样的效果,只能在开头给其重新赋值
  13. self::$num2 = 1;
  14. $this->num1++;
  15. self::$num2++;
  16. return '通过计数查看静态成员为所有实例共享,我是普通成员的数字'.$this->num1.',我是静态成员的数字'.self::$num2;
  17. }
  18. //静态方法由于也是不用实例化就能调用,因此内部没法使用$this调用的普通成员
  19. public static function sta(){
  20. return '我只能调取静态的变量'.self::$uname;
  21. }
  22. }
  23. $fa1 = new Father();
  24. $fa2 = new Father();
  25. $fa3 = new Father();
  26. $fa4 = new Father();
  27. $fa5 = new Father();
  28. $fa6 = new Father();
  29. echo $fa1->add1();
  30. echo '<hr>';
  31. echo $fa2->add1();
  32. echo '<hr>';
  33. echo $fa3->add1();
  34. echo '<hr>';
  35. echo $fa4->add1();
  36. echo '<hr>';
  37. echo $fa5->add1();
  38. echo '<hr>';
  39. echo $fa6->add1();
  40. echo '<hr>';
  41. echo $fa1->add2();
  42. echo '<hr>';
  43. echo $fa2->add2();
  44. echo '<hr>';
  45. echo $fa3->add2();
  46. echo '<hr>';
  47. echo $fa4->add2();
  48. echo '<hr>';
  49. echo $fa5->add2();
  50. echo '<hr>';
  51. echo $fa6->add2();

static

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议