博客列表 >浅谈PHP编程之面向对象

浅谈PHP编程之面向对象

xiablog
xiablog原创
2022年02月01日 18:14:23583浏览

浅谈PHP编程之面向对象

何为对象?

面向对象编程(object-oriented programming) [ˈɑːbdʒekt ˈɔːrientɪd ˈproʊɡræmɪŋ]

对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。

在现实世界里我们所面对的事情都是对象,如猫、狗、鸟等。

对象的主要三个特性:

  • 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
  • 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
  • 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。

比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。

对象的特点

  • 每一个对象都是独一无二的
  • 对象是一个特定的事物,他的职能是完成特定功能
  • 对象是可以重复使用

对象基本组成

  • 对象的组成元素:是对象的数据模型,用于描述对象的数据,又称为对象的属性,或者对象的成员变量.
  • 对象的行为: 是对象的行为模型,用于描述对象能够做什么事情,又被称为对象的成员方法.

属性的三种访问权限

  • public是公有的类成员,可以在任何地方被访问,可以被类以及子类或者对象都可以访问;
  • protected受保护的类成员,可以被其自身以及继承的子类访问,可以被子类继承,但是不能被对象访问,只能通过封装的方式让对象访问;
  • private私有的类成员,只能被自身访问.不能被子类继承,也不能被对象访问,只能在自身通过封装让外界访问(例如在类里面定义一个公开方法来调用私有属性);

对象的继承

父类:拥有部分相同的属性和方法
继承的好处:

  • 父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价;
  • 同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁;
  • 子类可以修改和调用父类定义的类成员我们称为重写(Overwrite), 一旦子类修改了,就按照子类修改之后的功能执行;

子类

  • 子类可以通过$this访问父类的属性
  • 子类的对象可以直接调用父类的方法和属性
  • PHP的单继承特性:类不允许同时继承多个父类(extends后面只能跟一个父类名称)

代码演示

创建如下文件:

  1. <?php
  2. // 成员属性前要有访问修饰符 public private protected
  3. // public 默认的, 关键词定义类内、类外、子类都可见
  4. // protected 关键词定义类内、子类可见,类外不可见
  5. // private 关键词定义类内可见, 子类、类外不可见
  6. class Cat
  7. {
  8. public $weight;
  9. public $species;
  10. public $color;
  11. // protected属性只能由本类或者子类访问
  12. protected $orprotect;
  13. // private属性只能由本类访问
  14. private $caneat;
  15. // 成员方法
  16. public function sleep()
  17. {
  18. echo "$this->species is sleeping <br>";
  19. }
  20. public function hunt()
  21. {
  22. echo "$this->species is hunting<br>";
  23. }
  24. public function caneat()
  25. {
  26. echo "$this->species$this->caneat";
  27. }
  28. public function privateeat()
  29. {
  30. //返回私有属性
  31. return $this->caneat;
  32. }
  33. // 构造函数 构造器 类每实例化一次 构造函数自动被调用
  34. // 类成员之间的互相访问 $this 本对象
  35. // 1.初始化类成员 让类/对象的状态稳定下来
  36. // 2.给对象的属性进行初始化赋值
  37. // 3.给私有或者受保护的成员属性赋值
  38. public function __construct($weight, $species, $color, $orprotect, $caneat)
  39. {
  40. $this->weight = $weight;
  41. $this->species = $species;
  42. $this->color = $color;
  43. $this->orprotect = $orprotect;
  44. $this->caneat = $caneat;
  45. }
  46. }
  47. // new关键字完成类的实例化 得到对象
  48. //$cat1 = new Cat('2kg', '橘猫', '橘色', '不是', '能吃');
  49. //var_dump($cat->caneat);//Cannot access private property Animal::$caneat
  50. // $cat1->caneat();//橘猫能吃
  51. //var_dump($cat1->privateeat());//string '能吃' (length=6)
  52. // object(Cat)[1]
  53. // public 'weight' => string '2kg' (length=3)
  54. // public 'species' => string '橘猫' (length=6)
  55. // public 'color' => string '橘色' (length=6)
  56. // protected 'orprotect' => string '不是' (length=6)
  57. // private 'caneat' => string '能吃' (length=6)
  1. <?php
  2. class Bird
  3. {
  4. public $name;
  5. public $color;
  6. public $taste;
  7. protected $oreat;
  8. private $orprotect;
  9. public function eat1()
  10. {
  11. return $this->oreat;
  12. }
  13. public function ordefend()
  14. {
  15. echo $this->orprotect;
  16. }
  17. public function sparrowinfo()
  18. {
  19. echo $this->name . "的颜色是" . $this->color . "。<br>" . "味道" . $this->taste . "<br>";
  20. }
  21. public function __construct($name, $color, $taste, $oreat, $orprotect)
  22. {
  23. $this->name = $name;
  24. $this->color = $color;
  25. $this->taste = $taste;
  26. $this->oreat = $oreat;
  27. $this->orprotect = $orprotect;
  28. }
  29. }
  30. // $sparrow = new Bird('麻雀', '黑棕色', '美味', '能吃', '不是');
  31. // $sparrow->sparrowinfo();
  32. // echo $sparrow->eat1();
  1. <?php
  2. class Dog
  3. {
  4. public $name;
  5. public $color;
  6. public $taste;
  7. protected $oreat;
  8. private $orprotect;
  9. public function eat1()
  10. {
  11. return $this->oreat;
  12. }
  13. public function ordefend()
  14. {
  15. echo $this->orprotect;
  16. }
  17. public function sparrowinfo()
  18. {
  19. echo $this->name . "的颜色是" . $this->color . "。<br>" . "味道" . $this->taste . "<br>";
  20. }
  21. public function __construct($name, $color, $taste, $oreat, $orprotect)
  22. {
  23. $this->name = $name;
  24. $this->color = $color;
  25. $this->taste = $taste;
  26. $this->oreat = $oreat;
  27. $this->orprotect = $orprotect;
  28. }
  29. }
  1. <?php
  2. class Product{
  3. public $type;
  4. public $color;
  5. protected $weight;
  6. private $price;
  7. public function weight(){
  8. return $this->weight;
  9. }
  10. public function price(){
  11. echo $this->price;
  12. }
  13. public function __construct($type,$color,$weight,$price)
  14. {
  15. $this->type = $type;
  16. $this->color = $color;
  17. $this->weight = $weight;
  18. $this->price = $price;
  19. }
  20. }
  1. <?php
  2. class Sonproduct extends Product
  3. {
  4. }

类的自动加载器

  1. <?php
  2. //类的自动加载器前提是类名称跟类文件名称保持一致(psr-4规范)
  3. spl_autoload_register(function ($classname) {
  4. $file = __DIR__ . DIRECTORY_SEPARATOR . $classname . '.php';
  5. echo $classname . ".php" . "<br>";
  6. if(!(is_file($file) && file_exists($file))){
  7. throw new \Exception("文件不合法或者不存在");
  8. }
  9. require $file;
  10. });

相对于第三方框架、库,我们就是客户端代码文件,我们直接实例化对象

  1. <?php
  2. //相对于第三方框架、库,我们就是客户端代码文件
  3. require 'autoload.php';
  4. //直接实例化对象
  5. $cat1 = new Cat('2kg', '橘猫', '橘色', '不是', '能吃');
  6. $sparrow = new Bird('麻雀', '黑棕色', '美味', '能吃', '不是');
  7. $husky = new Dog('哈士奇', '黑白', '未知', '应该能', '不是');
  8. $computer = new Product('台式电脑','black','5kg','¥6666');
  9. $laptop = new Sonproduct('笔记本','炫酷黑','1.5kg','¥8888');
  10. var_dump($cat1);
  11. var_dump($sparrow);
  12. var_dump($husky);
  13. var_dump($computer);
  14. var_dump($laptop);
  15. echo $laptop->price();

打印结果如下:

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