Blogger Information
Blog 60
fans 5
comment 3
visits 65309
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP面向对象编程设计一
longlong
Original
548 people have browsed it

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关键字后,就不能再扩展/继承了

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