博客列表 >面向对象编程-第九期php线上班

面向对象编程-第九期php线上班

emagic
emagic原创
2019年12月05日 14:34:51745浏览

12月03日作业:

1. 手抄课堂笔记: 1203.md (必做)

2. 编程代码,抄写课堂案例,也可以自定义(选做)

demo1.php

  1. <?php
  2. //OOP基本步骤
  3. //1.创建类
  4. class Demo1{
  5. //2.添加类成员
  6. //在类中的变量和函数,和程序中的变量与函数有区别,添加了访问控制符
  7. //套马甲 变量->属性 , 函数 -> 方法 ,先写访问控制符,跟着写成员
  8. // 创建属性
  9. public $site='php中文网';
  10. //创建方法
  11. public function getSite(){
  12. // 输出当前类的属性
  13. // 第一步,类的实例化
  14. $obj=new Demo1();
  15. return $obj->site.'欢迎您!~~';
  16. //第二步,然后返回值
  17. }
  18. }
  19. //3.访问类成员
  20. //可以在类的外部进行访问
  21. //先要创建类的实例才能访问里面的成员
  22. $obj=new Demo1();
  23. //访问属性 和 访问方法 都叫 访问类成员 使用对象成员访问符 ->
  24. echo $obj -> site .'<br>'; //访问属性
  25. echo $obj ->getSite(); //访问方法

demo2.php

  1. <?php
  2. //1.创建类
  3. class Demo2{
  4. //2.添加类成员
  5. public $site='php中文网';
  6. public $role='讲师';
  7. public function getSite(){
  8. // 第一步,类的实例化;self是类名的引用,始终与当前类名绑定
  9. // $obj=new self;
  10. return $this->site.'欢迎您!~~';
  11. // $this是当前类的实例的引用,伪对象,它始终与当前类的实例绑定
  12. //第二步,然后返回值
  13. }
  14. public function getRole(){
  15. // 第一步,类的实例化;self是类名的引用,始终与当前类名绑定
  16. // $obj=new self;
  17. return $this->role;
  18. //第二步,然后返回值
  19. }
  20. }
  21. //3.访问类成员
  22. $obj=new Demo2();
  23. //访问属性 和 访问方法 都叫 访问类成员 使用对象成员访问符 ->
  24. echo $obj -> site .'<br>'; //访问属性
  25. echo $obj ->getRole().'<br>'; //访问方法

demo3.php

  1. <?php
  2. //1.创建类
  3. class Demo3{
  4. //2.添加类成员
  5. public $site; //变成抽象属性,先不赋值,不写死,不给值默认值是null,后面通过构造函数进行传值
  6. public $role;
  7. public function getInfo(){
  8. return '我是:'.$this->site.$this->role;
  9. }
  10. //构造方法:在实例化的时候系统自动调用 魔术方法 名称固定 __construct()
  11. //构造方法一般完成两件事情:1.类实例的初始化;2.自动完成在类实例创建过程中的操作
  12. public function __construct($site,$role)
  13. {
  14. //1.初始化类成员 ☆☆☆☆☆☆☆☆☆
  15. $this->site=$site;
  16. $this->role=$role;
  17. // //2.创建类实例 //辅助理解,这么写不对,但过程存在
  18. // $obj=new self();
  19. // // 3.添加类实例成员 //辅助理解,这么写不对,但过程存在
  20. // $obj->site=$this->site;
  21. // $obj->role=$this->role;
  22. // 创建时同步自动执行的代码 ☆☆☆☆☆☆☆☆☆
  23. echo $this->getInfo(); //放在return前面,自动创建时执行才有意义
  24. // 4.返回类实例 //辅助理解,这么写不对,但过程存在
  25. // return $obj;
  26. }
  27. }
  28. //3.访问类成员
  29. $obj=new Demo3('PHP 英文网English','Docter'); //构造方法要传参,访问时也要给参数

demo4.php

  1. <?php
  2. //访问控制,实现对类的封装
  3. //1.创建类
  4. class Demo4{
  5. //2.添加类成员
  6. public $site; //变成抽象属性,先不赋值,不写死,不给值默认值是null,后面通过构造函数进行传值
  7. // 不想让该属性在类的外部被访问,可以将该属性的访问控制符修改为:private或者protected
  8. private $role;
  9. // private $name='emagic';
  10. public function getInfo(){
  11. return '我是:'.$this->site.$this->role;
  12. }
  13. //构造方法:
  14. public function __construct($site,$role)
  15. {
  16. //1.初始化类成员 ☆☆☆☆☆☆☆☆☆
  17. $this->site=$site;
  18. $this->role=$role;
  19. }
  20. // 外部无权访问,是为了防止非法访问,不代表禁止访问
  21. //为这样的属性创建一个访问器方法,来过滤访问请求
  22. // public function getRole(){
  23. //// 仅允许指定用户名的账户访问,其他用户返回无权访问提示
  24. // $username=$_GET['username']??'';
  25. //// 等同于之前版本的$username=isset($_GET['username'])?$_GET['username']:'无权访问';
  26. // if(isset($username) && $username ==='admin') {
  27. // return $this->role;
  28. // }else{
  29. // return '无权访问';
  30. // }
  31. // }
  32. // public function getName(){
  33. // return isset($this->name)?$this->name:'不存在该属性';
  34. // }
  35. // 魔术方法 __get($要取的属性),属性重载
  36. public function __get($name){
  37. // 仅允许指定用户名的账户访问,其他用户返回无权访问提示
  38. $username=$_GET['username']??'';
  39. // 等同于之前版本的$username=isset($_GET['username'])?$_GET['username']:'无权访问';
  40. if(isset($username) && $username ==='admin') {
  41. return isset($this->$name)?$this->$name:'属性未定义';
  42. }else{
  43. return '无权访问';
  44. }
  45. }
  46. }
  47. //3.访问类成员
  48. $obj = new Demo4('www. PHP 法文网 .io','讲师');
  49. echo $obj->role .'<br>'; //封装后的private、protected从外部不能直接这样访问,要用访问器,除非使用了属性重载 如__get,就可以使用
  50. //使用访问器方法访问 ☆☆☆☆☆
  51. //echo $obj->getRole();
  52. echo '<hr>';
  53. //echo $obj->name; //对于不存在的数据如何控制操作
  54. //echo $obj->getName(); //使用访问器方法访问 ☆☆☆☆☆

demo5

  1. <?php
  2. //类的继承
  3. //1.创建类
  4. class Demo5
  5. {
  6. //2.添加类成员
  7. public $site;
  8. private $role;
  9. // private $name='emagic';
  10. public function getInfo()
  11. {
  12. return '我是:' . $this->site . '讲师:'.$this->role;
  13. }
  14. //构造方法:
  15. public function __construct($site, $role)
  16. {
  17. $this->site = $site;
  18. $this->role = $role;
  19. }
  20. }
  21. class Demo5_1 extends Demo5{
  22. //子类也是个类
  23. private $course;//继承是为了发展,扩展属性,当前子类的自身属性
  24. public function __construct($site, $role, $course)
  25. {
  26. // parent调用父类的构造方法
  27. parent::__construct($site, $role);
  28. $this->course=$course;
  29. }
  30. // 重写父类中的方法也是一种扩展
  31. public function getInfo()
  32. {
  33. return parent::getInfo().',负责的课程是:'.$this->course;
  34. }
  35. }
  36. //3.访问类成员
  37. $sub = new Demo5_1('PHP粤语网','Emagic','php');
  38. echo $sub->getInfo();

demo6.php

  1. <?php
  2. //trait代码复用方式,用来扩展当前类的功能
  3. //trait当做公共方法库,代码库
  4. //trait借助了累的定义的语法,但不是类,所以不能实例化
  5. trait Test{
  6. public function getInfo(){
  7. return '我是:'.$this->site.'讲师'.$this->role;
  8. }
  9. }
  10. //1.创建类
  11. //将一个trait类库嵌入到类库中,Demo6又可以叫做宿主类
  12. class Demo6{
  13. //如何导入trait类库,用关键字use
  14. use Test;
  15. // 2.添加类成员
  16. public $site;
  17. protected $role;
  18. // public function getInfo(){
  19. // return '我是:'.$this->site.'讲师'.$this->role;
  20. // }
  21. //构造方法
  22. public function __construct($site,$role)
  23. {
  24. $this->site=$site;
  25. $this->role=$role;
  26. }
  27. }
  28. //trait 还可以用在类的继承的上下文环境中
  29. class Demo6_1 extends Demo6{
  30. // 当前子类的自身属性
  31. private $course;
  32. public function __construct($site, $role,$course)
  33. {
  34. //parent调用父类中的成员
  35. parent::__construct($site, $role);
  36. $this->course=$course;
  37. }
  38. // 重写父类中的方法
  39. public function getInfo()
  40. {
  41. return parent::getInfo().',负责的课程是:'.$this->course;
  42. }
  43. }
  44. //优先级关系:当前类中的同名方法>trait类中的同名方法>父类中的同名方法
  45. //3.访问类成员
  46. $obj = new Demo6('php 蚊子网','emagic');
  47. echo $obj->getInfo();
  48. echo '<hr>';
  49. $sub= new Demo6_1('php.io','莫小仙','php');
  50. echo $sub->getInfo();

demo7

  1. <?php
  2. //接口
  3. //对象的模板是类,类的模板是哪个?类的模板就是接口
  4. //面向接口编程是最重要的编程思想之一,许多高级应用都严重依赖于它
  5. //接口是一种约定,他是定义了实现它的类中必须实现的方法
  6. //接口中没有方法都是具体实现,所以不能实例化。
  7. //接口定义工作类中的方法原型
  8. interface iDemo{
  9. //php有接口常量和接口防范,接口常量一般用做配置文件
  10. public function getinfo(); //接口中没有具体事下,所以不用花括号{}
  11. public function hello();
  12. }
  13. //1.创建类
  14. //Demo7实现了接口的方法,现在叫工作类.接口定义的方法出现几个它必须都要实现几个
  15. class Demo7 implements iDemo
  16. {
  17. //2.添加类成员
  18. public $site;
  19. protected $role;
  20. public function getInfo(){
  21. return '我是:'.$this->site.'讲师'.$this->role;
  22. }
  23. public function hello()
  24. {
  25. return 'Hello 大家晚上吃好了吗?';
  26. }
  27. //构造方法
  28. public function __construct($site,$role)
  29. {
  30. $this->site=$site;
  31. $this->role=$role;
  32. }
  33. }
  34. //3.访问类成员
  35. $obj=new Demo7('php泰文网','peter猜');
  36. echo $obj->getInfo().'<br>';
  37. echo $obj->hello().'<br>';

demo8.php

  1. <?php
  2. //抽象类
  3. //接口中全是抽象方法,而抽象类中有抽象方法也有具体已实现的方法,两者共同之处就是都不能实例化,因为有抽象方法
  4. abstract class Chouxiang{
  5. //抽象方法 未实现,加abstract,子类要实现
  6. abstract public function getInfo ();
  7. //具体方法,已实现方法
  8. public function hello()
  9. {
  10. return 'Hello 大家晚上吃好了吗?';
  11. }
  12. }
  13. //1.创建类
  14. //Demo8 工作类
  15. class Demo8 extends Chouxiang
  16. {
  17. //2.添加类成员
  18. public $site;
  19. protected $role;
  20. public function getInfo(){
  21. return '我是:'.$this->site.'讲师'.$this->role;
  22. }
  23. //构造方法
  24. public function __construct($site,$role)
  25. {
  26. $this->site=$site;
  27. $this->role=$role;
  28. }
  29. }
  30. //3.访问类成员
  31. $obj=new Demo8('php俄文网','Zhu洛夫斯基');
  32. echo $obj->getInfo().'<br>';
  33. echo $obj->hello().'<br>';

对着天空,将OOP编程的三大步骤,大声的喊10遍

课堂小结

1.Demo1 经常性访问类的成员,会频繁实例化,每次都要$obj=new Demo2(),且受类名变动影响大

编程要做到一处更新处处有效

2.Demo2 改进了demo1 ,self是类名的引用,始终实现与当前类名绑定

但仍有个问题没有解决,$obj是当前类的一个实例(对象),每次都要new ,没有实现共享
改进->$this是当前类的实例的引用,伪对象,它始终与当前类的实例绑定
$obj=new self;return $obj->site;可以直接用return $this->site代替

3.类的实例化new Demo3() 与 函数调用 Demo3()只差了一个关键字new,但是实例化的时候里面自动调用了一些函数进行了操作

demo3 演示构造方法:在实例化的时候系统自动调用 魔术方法 名称固定 __construct()
构造方法一般完成两件事情:
(1)类实例的初始化;
(2)自动完成在类实例创建过程中的操作

4.demo4研究如何限制对类成员的访问,实现对类的封装

魔术方法 get($要取的属性),属性重载set($name,$value),isset,unset.
echo $obj->role .’<br>‘; //封装后的private、protected从外部不能直接这样访问,要用访问器,除非使用了属性重载 如__get,就可以使用

5.类的继承 extends

实现代码的重复利用
继承是为了发展,扩展属性,当前子类的自身属性
parent调用父类的构造方法
重写父类中的方法也是一种扩展

6.trait 多继承

trait当做公共方法库,代码库
当前类中的同名方法>trait类中的同名方法>父类中的同名方法

7.接口

Demo7实现了接口的方法,现在叫工作类.接口定义的方法出现几个它必须都要实现几个
接口是一种约定,他是定义了实现它的类中必须实现的方法
接口中没有方法都是具体实现,所以不能实例化。

8.抽象类

接口中全是抽象方法,而抽象类中有抽象方法也有具体已实现的方法,两者共同之处就是都不能实例化,因为有抽象方法

phpstrom里面设置PHP版本时,不能下拉选中版本,要取消对勾的地方,下拉箭头就由灰色变成可选的了

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