Blogger Information
Blog 53
fans 3
comment 0
visits 46631
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
面向对象编程-第九期php线上班
emagic
Original
746 people have browsed it

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版本时,不能下拉选中版本,要取消对勾的地方,下拉箭头就由灰色变成可选的了

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:完成的不错, 对于重要进行了标注, 很好的习惯
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post