博客列表 >2019年12月3号:面向对象编程

2019年12月3号:面向对象编程

Rambo-Yang
Rambo-Yang原创
2019年12月04日 15:08:11758浏览

创建类和对象

  1. //1,创建类
  2. class Demo
  3. {
  4. //2,添加类成员
  5. public $site = 'PHP中文网';
  6. public $role = '讲师';
  7. public function getSite(){
  8. return $this->site.' 欢迎您';
  9. }
  10. public function getRole(){
  11. return $this->role;
  12. }
  13. }
  14. //3,访问类成员
  15. $obj = new Demo();
  16. echo $obj->site .'<br>';
  17. echo $obj->getRole() . '<br>';
  18. echo $obj->getSite() . '<br>';

运行效果:

构造方法

  1. class Demo2
  2. {
  3. public $site;
  4. public $role;
  5. public function getInfo()
  6. {
  7. return '我是:' . $this->site . $this->role;
  8. }
  9. //构造方法:实例化即执行
  10. public function __construct($site,$role){
  11. $this->site = $site;
  12. $this->role = $role;
  13. echo $this->getInfo();
  14. }
  15. }
  16. new Demo2('PHP中文网','老师');

运行效果:

魔术方法 __get($name)属性重载

  1. class Demo3
  2. {
  3. public $site;
  4. protected $role;
  5. public function getInfo()
  6. {
  7. return '我是:' . $this->site . $this->role;
  8. }
  9. //构造方法
  10. public function __construct($site, $role)
  11. {
  12. $this->site = $site;
  13. $this->role = $role;
  14. }
  15. //魔术方法:__get($name) ,属性重载
  16. public function __get($name)
  17. {
  18. $username = isset($_GET['username']) ? $_GET['username'] : '';
  19. if (isset($username) && $username == 'admin'){
  20. return isset($this->$name) ? $this->$name : '属性未定义';
  21. }else{
  22. return '无权访问';
  23. }
  24. }
  25. }
  26. $obj = new Demo3('PHP中文网','讲师');
  27. echo $obj->role;
  28. echo '<hr>';
  29. echo $obj->name;
  30. //$this->name 这是访问类中的一个名为name的成员变量
  31. //$this->$name 这是访问对象中的可变变量,可以理解成动态变量,变量名由$name的值决定,
  32. //如果$name = 'site' 那么 $this->$name 就等于$this->site 再查找当前类中是否有属性为site的成员变量

运行效果:

继承

  1. class Demo4
  2. {
  3. public $site;
  4. protected $role;
  5. public function getInfo(){
  6. return '我是:' . $this->site . ' 讲师:' . $this->role;
  7. }
  8. public function __construct($site,$role)
  9. {
  10. $this->site = $site;
  11. $this->role = $role;
  12. }
  13. }
  14. class Demo4_1 extends Demo4
  15. {
  16. private $course;
  17. public function __construct($site, $role, $course)
  18. {
  19. parent::__construct($site, $role);
  20. $this->course = $course;
  21. }
  22. public function getInfo()
  23. {
  24. return parent::getInfo() . ',负责的课程是:' . $this->course;
  25. }
  26. }
  27. $obj = new Demo4_1('php.cn','朱老师','php');
  28. echo $obj->getInfo();

运行效果:

trait公共方法库

  1. //trait 当成一个公共方法库,不能实例化
  2. trait Test
  3. {
  4. public function getInfo(){
  5. return '我是:'. $this->site . ' 讲师:' . $this->role;
  6. }
  7. }
  8. class Demo5
  9. {
  10. //导入trait类库
  11. use Test;
  12. public $site;
  13. protected $role;
  14. public function __construct($site,$role)
  15. {
  16. $this->site = $site;
  17. $this->role = $role;
  18. }
  19. }
  20. class Demo5_1 extends Demo5{
  21. private $course;
  22. public function __construct($site, $role,$course)
  23. {
  24. parent::__construct($site, $role);
  25. $this->course = $course;
  26. }
  27. }
  28. // 优先级: 当前类中的同名方法 > trait类中的同名方法 > 父类中的同名方法
  29. $demo5 = new Demo5('PHP中文网','朱老师');
  30. echo $demo5->getInfo();
  31. echo '<hr>';
  32. $obj = new Demo5_1('php.cn','zhulaoshi','PHP');
  33. echo $obj->getInfo();

运行效果:

接口

  1. //接口:定义工作类中的方法原型
  2. interface iDemo{
  3. public function getInfo();
  4. public function hello();
  5. }
  6. class Demo6 implements iDemo
  7. {
  8. public $site;
  9. protected $role;
  10. public function getInfo()
  11. {
  12. return '我是:' . $this->site . '讲师:'. $this->role;
  13. }
  14. public function hello(){
  15. return 'Hello Word!';
  16. }
  17. public function __construct($site,$role)
  18. {
  19. $this->site = $site;
  20. $this->role = $role;
  21. }
  22. }
  23. $obj = new Demo6('PHP中文网','朱老师');
  24. echo $obj->getInfo();
  25. echo '<hr>';
  26. echo $obj->hello();

运行效果:

抽象类

  1. //抽象类
  2. abstract class Cx
  3. {
  4. abstract public function getInfo();
  5. public function hello(){
  6. return 'Hello Word!';
  7. }
  8. }
  9. class Demo7 extends Cx
  10. {
  11. public $site;
  12. protected $role;
  13. public function getInfo()
  14. {
  15. return '我是:' . $this->site . '讲师' . $this->role;
  16. }
  17. public function __construct($site,$role)
  18. {
  19. $this->site = $site;
  20. $this->role = $role;
  21. }
  22. }
  23. $obj = new Demo7('php中文网','朱老师');
  24. echo $obj->getInfo() . '<br>';

运行效果:

手写:

总结:

1, 面向对象编程的基本流程:创建类,添加类成员,访问类成员
2, self 引用当前类,$this 引用当前类的实例/对象
3, __construct构造方法,实例化类时就会同步执行
4, 访问控制符punlic 类内、类外、子类均可见,protected类内、子类可见,类外不可见,private仅本类内可访问
5, $this->name 这是访问类中的一个名为name的成员变量
6, $this->$name 这是访问对象中的可变变量,可以理解成动态变量,变量名由$name的值决定, 如果$name = 'site' 那么 $this->$name 就等于$this->site 再查找当前类中是否有属性为site的成员变量
7, trait: 当成一个公共方法库,使用了类的定义的语法,但不是类,所以不能实例化,用use导入到类中使用
8, 优先级: 当前类中的同名方法 > trait类中的同名方法 > 父类中的同名方法
9, interface 接口只允许出现方法和常量,可见性必须为public,不能有方法体,接口中的方法必须都为抽象方法
10, 接口是一种约定, 定义了实现它的类中必须实现的方法,没有方法的具体实现, 所以不能实例化
11, implements类实现接口的关键字
12, abstract定义抽象方法、抽象类
13, 抽象类只能被继承,不能实例化,且抽象方法都必须在子类复写
14, 抽象方法不能有方法体,不能有{}

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