博客列表 >PHP面向对象编程设计一

PHP面向对象编程设计一

longlong
longlong原创
2020年07月22日 12:19:12549浏览

1. 基本内容

这节课讲了面向对象其中一部分内容,主要有以下几点:

  • 类与实例:类的实例,实际上就是一个对象,类使用class关键字定义,类的示例使用new关键字定义

  • 类属性与类方法:不管属性还是方法,只要在前面加上了static关键字,就表示静态属性或静态方法,此时,就可以不需要实例化类而直接访问了,也因为不需要使用对象来调用,所以伪变量$this在静态方法中就不能使用了

  • 类成员的访问控制:也可以叫做封装,实际上就是使用publicprivateprotected关键字对类成员(包括类属性和类方法)的作用域设置使用范围

  • 类的扩展及扩展方式:实际上就是类的继承,子类共享父类的属性和方法,并且子类可以对父类中的属性或方法进行覆盖或者扩展

2. 实例演示

2.1 类与示例

  1. <?php
  2. // 类与示例
  3. // 1. 声明一个类
  4. class Car
  5. {
  6. public $price;
  7. public $performance;
  8. public function config () {}
  9. }
  10. // 2. 类的示例:对象
  11. $Bmw = new Car();
  12. // 3. 简写:可省略小括号
  13. $Changan = new Car;

2.2 类属性与类方法

  1. <?php
  2. // 类成员:包括类属性和类方法
  3. class Cars
  4. {
  5. // 1. 类属性
  6. public $price;
  7. public $brand;
  8. public $performance;
  9. // 2. 类方法
  10. public function config () {
  11. printf('%s 的价格才 %d 元,性能也 %s ,配置是真好!',$this->brand,$this->price,$this->performance);
  12. }
  13. // 构造函数:它是一种特殊的方法,主要用来对 对象成员变量赋初始值,此方法必须在类实例中用 new 来调用
  14. public function __construct($bra,$pri,$per)
  15. {
  16. // 为变量赋值
  17. // $this:表示类实例引用,相当于 $this = new self ;
  18. // self :引用当前类名称
  19. $this->price = $pri;
  20. $this->brand = $bra;
  21. $this->performance = $per;
  22. }
  23. }
  24. // 实例化一个类,并传参
  25. $changan = new Cars('长安',20000,'not bad');
  26. // 调用函数
  27. $changan->config();
  28. echo '<hr>';
  29. // 动态类:和可变变量差不多,就是将类名称放到一个变量中
  30. $car = 'Cars';
  31. // 原始写法:
  32. // $wuling =new Cars('五菱',19000,'not bad');
  33. // 动态类写法:利用变量
  34. $wuling =new $car('五菱',19000,'not bad');
  35. $wuling->config();

  1. <?php
  2. // 类成员中的 static 关键字
  3. // 一旦声明了属性或方法为static(静态),就可以不实例化类而直接访问了,
  4. // 因为静态方法不需要通过对象就可以调用,所以$this在静态方法中不可用
  5. class Info
  6. {
  7. public static $sex = 'male';
  8. public static function same () {
  9. // 这里使用$this的话会报错
  10. // return 'We are all '.$this->$sex;
  11. // 使用self:表示引用当前类名称
  12. return 'We are all '.self::$sex;
  13. }
  14. }
  15. // 不需要实例化类,直接访问
  16. echo Info::$sex;
  17. echo '<hr>';
  18. echo Info::same();

2.3 类成员的访问控制

  1. <?php
  2. // 类成员的访问控制:也叫封装
  3. // 通过关键字 public、private、protected 来声明类成员的作用域
  4. class StuInfo
  5. {
  6. // public 公共的,在类的外部、内部以及子类都可使用
  7. public $name = '佩奇';
  8. // protected 受保护的,在类的内部和子类均可使用,仅外部不能使用
  9. protected $score = '90';
  10. // private 私有的,仅在类的内部使用,外部和子类均不能使用
  11. private $grade = '一年级';
  12. public function info () {
  13. return "{$this->grade} 学生 {$this->name} 的平均分是 {$this->score} 分";
  14. }
  15. }
  16. // 子类
  17. class StuInfo1 extends StuInfo
  18. {
  19. public function info () {
  20. // 如果加入 {$this->grade} ,就会报错,因为这是私有成员,子类也不能使用
  21. // return "{$this->grade} 学生 {$this->name} 的平均分是 {$this->score} 分";
  22. return " 学生 {$this->name} 的平均分是 {$this->score} 分";
  23. }
  24. }
  25. // 1. 实例化类,调用函数,均可输出,表示任何类型在内部均可使用
  26. $demo1 = new StuInfo;
  27. $res = $demo1->info();
  28. echo $res.'<hr>';
  29. // 2. name输出,score无输出,grade报错,表示public在外部可用,protected和pricate在外部均不可使用,
  30. $demo2 = new StuInfo;
  31. echo $demo2->name,'<br>';
  32. // echo $demo2->score,'<br>';
  33. // echo $demo2->grade,'<br>';
  34. echo '<hr>';
  35. // 3. 实例化子类,现在有输出,表示public和protected在子类中可用
  36. $demo3 = new StuInfo1;
  37. echo $demo3->info();

2.4 类的扩展及扩展方式

  1. <?php
  2. // 类的扩展及扩展方式:扩展也叫做继承
  3. // 扩展方式分为:属性扩展和方法扩展
  4. // 扩展有两层意思:1. 在原来的基础之上增加内容 2.覆盖原来的内容
  5. class Stu
  6. {
  7. public $name = '佩奇';
  8. public $grade = '一年级';
  9. public $hello ='棒棒哒';
  10. public function info () {
  11. return "{$this->grade} 学生 {$this->name} {$this->hello}";
  12. }
  13. }
  14. // 扩展:增加内容
  15. class Demo1 extends Stu
  16. {
  17. // 1. 属性扩展,子类能够继承父类的属性,现在我只增加一个属性
  18. public $score = '100';
  19. // 2. 方法扩展,在原有的方法上,增加内容
  20. public function info () {
  21. // return "{$this->grade} 学生 {$this->name} {$this->hello}";
  22. // 引用父类的方法,简写:
  23. return parent::info()." , 因为它考了 {$this->score} 分";
  24. }
  25. }
  26. $obj1 = new Stu;
  27. echo $obj1->info(),'<hr>';
  28. $obj2 = new Demo1;
  29. echo $obj2->info(),'<hr>';
  30. // 扩展:覆盖内容
  31. class Demo2 extends Stu
  32. {
  33. // 1. 属性扩展,修改父类中的属性
  34. public $name = '柯蓝';
  35. public $grade = '六年级';
  36. // 2. 方法扩展,修改父类中的方法
  37. public function info () {
  38. return "{$this->grade} 学生 {$this->name} 帅爆了";
  39. }
  40. }
  41. $obj3 = new Stu;
  42. echo $obj3->info(),'<hr>';
  43. $obj4 = new Demo2;
  44. echo $obj4->info(),'<hr>';

  1. <?php
  2. // final 关键字 :一旦使用此关键字,表示方法或者类都不允许扩展或者继承
  3. final class Stu
  4. // class Stu
  5. {
  6. public $name = '佩奇';
  7. public $grade = '一年级';
  8. public $hello ='棒棒哒';
  9. // 1. 方法使用 final 关键字
  10. final public function info () {
  11. return "{$this->grade} 学生 {$this->name} {$this->hello}";
  12. }
  13. }
  14. class Demo1 extends Stu
  15. {
  16. public $name = '孙悟空';
  17. // 方法扩展
  18. public function info () {
  19. return "{$this->grade} 学生 {$this->name}";
  20. }
  21. }
  22. $obj = new Demo1;
  23. echo $obj->info();

3. 总结

  • 声明类与实例化类比较简单,知道两个关键词,classnew

  • 加入了static关键字的属性或方法,就不需要实例化了,可以直接使用类来访问,语法:类名称::类方法或者类属性,记住:在类方法中$this->没有用了,要使用self::来引用当前类名称,访问类属性

  • 记住类成员加入了publicprivateprotected关键字后,其作用域范围

  • 扩展/继承中,子类能够继承父类的属性和方法,也能对其修改或者更新,但是一旦方法或者类加入final关键字后,就不能再扩展/继承了

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