博客列表 >类与对象及命名空间初步

类与对象及命名空间初步

吴长清
吴长清原创
2022年08月16日 10:44:13343浏览

1.类与对象

1.1 类的扩展(继承)

关键字extends

  1. <?php
  2. namespace _0815;
  3. /**
  4. * 学生类
  5. */
  6. class Student
  7. {
  8. //公共属性 类中、类外、子类皆可以使用
  9. public int $age;
  10. //受保护的 类中、子类中可以使用
  11. protected string $name;
  12. //私有属性 只能在类中使用
  13. private int $id = 101;
  14. // 构造方法
  15. public function __construct($name)
  16. {
  17. $this->name = $name;
  18. }
  19. //自定义方法 受保护的 只能在子类中使用扩展
  20. protected function getInfo(): string
  21. {
  22. return '父类私有属性=>id: ' . $this->id . ',<br>父类公共属性=> 姓名: ' . $this->name;
  23. }
  24. }
  25. /**
  26. * 小学生类 继承 学生类
  27. * 对学生类进行扩展
  28. */
  29. class PrimarySchool extends Student
  30. {
  31. // 属性扩展
  32. private string $lesson;
  33. private int $score;
  34. // 构造方法扩展
  35. public function __construct($name, $lesson, $score)
  36. {
  37. // parent: 引用父类的构造方法
  38. parent::__construct($name);
  39. $this->lesson = $lesson;
  40. $this->score = $score;
  41. }
  42. // 子类中对自定义方法扩展
  43. // 若是父类的关键字是protected,那么子类关键字只能时public和protected
  44. // 若是父类的关键字是public,那么子类关键字只能是public
  45. public function getInfo(): string
  46. {
  47. return parent::getInfo() . ', <br> 子类扩展=> 课程: ' . $this->lesson . ', 成绩: ' . $this->score;
  48. }
  49. }
  50. $primarySchool = new PrimarySchool('张国', '数学', 90);
  51. echo $primarySchool->getInfo();

1.2 类的抽象

关键字abstract

  1. <?php
  2. namespace _0815;
  3. /**
  4. *
  5. * 声明抽象类:abstract
  6. * 只要是抽象类,其父类中的属性和方法不能直接访问,必须通过子类扩展后访问
  7. * 如果类中有抽象方法。则这个类必须声明为抽象类
  8. */
  9. abstract class Demo1
  10. {
  11. public string $name;
  12. // 如果某个方法没有具体实现(只声明未实现),应该声明成抽象方法
  13. abstract public static function getInfo($name);
  14. }
  15. /**
  16. * 若父类时抽象类,子类扩展时必须将父类的抽象方法实现,否则报错
  17. */
  18. class Demo2 extends Demo1
  19. {
  20. // 实现父类抽象类的方法
  21. public static function getInfo($name)
  22. {
  23. return 'Hello, ' . $name;
  24. }
  25. }
  26. // 输出结果 Hello,张三
  27. echo Demo2::getInfo('张三');

关键字final 只要声明为final的类,是不可以继承扩展的

  1. final class Demo3
  2. {
  3. //代码块
  4. }

1.3 接口

关键字interface 接口命名规则:小写的i开头加类名,如:iUser iStu
关键字implements 实现接口

  1. <?php
  2. namespace _0815;
  3. //接口
  4. interface iUserInfo
  5. {
  6. //常量
  7. public const NATION = 'China';
  8. //方法 没有具体实现
  9. public function getInfo();
  10. public function m2();
  11. }
  12. // 接口实现类
  13. class UserInfo implements iUserInfo
  14. {
  15. public string $name = '张三';
  16. //必须实现接口类中的所有方法
  17. public function getInfo():string
  18. {
  19. return 'Hello, ' . $this->name;
  20. }
  21. public function m2()
  22. {
  23. }
  24. }
  25. $userInfo = new UserInfo();
  26. // 输出结果 Hello,张三
  27. echo $userInfo->getInfo();

2.命名空间

2.1 全局成员

全局成员包含函数 常量 类/接口
特点:全局可使用,禁止重复声明

2.2 命名空间

命名空间的作用
是为了解决全局变量命名冲突的问题
类似同一个目录不允许同名文件存在,但是可以通过新建目录的方式来解决

声明方式
关键字:namespace 命名空间名称

跨空间成员的访问方式

  1. <?php
  2. //命名空间:_0815_one
  3. namespace _0815_one;
  4. function getInfo(): string
  5. {
  6. return __METHOD__ . '<br>';
  7. }
  8. // 1. 当前路径: 非限定名称, 访问当前空间内的方法: getInfo()
  9. echo '当前路径: ' . getInfo();
  10. // 跨空间请求
  11. // 2. 相对路径: 限定名称, 跨空间访问:two\Index::getInfo()
  12. echo '跨空间访问-相对路径: ' . two\Index::getInfo();
  13. // 3. 绝对路径: 完全限定名称, 跨空间访问: \_0815_one\two\Index::getInfo()
  14. echo '跨空间访问-绝对路径: ' . \_0815_one\two\Index::getInfo();
  15. // 4. 别名访问
  16. use \_0815_one\two\Index as indexInfo;
  17. echo '跨空间访问-别名访问: ' . indexInfo::getInfo();
  18. //命名空间:_0815_one\two
  19. namespace _0815_one\two;
  20. class Index
  21. {
  22. public static function getInfo(): string
  23. {
  24. return __METHOD__ . '<br>';
  25. }
  26. }
  27. echo Index::getInfo();

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