浅谈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();

打印结果如下:

更多相关文章

  1. JavaScript 之 Proxy
  2. 《Android》Lesson21-广播+SharedPreferences
  3. Android(安卓)JNI和NDK学习(09)--JNI实例二 传递类对象
  4. Android(安卓)通过intent 传递对象
  5. android如何调用Web Service手机归属地练习
  6. android之ArrayAdaper之Spinner
  7. Android使用DigitalClock进行定时抢购
  8. Android线程间通信的Message机制
  9. android平台解析epub格式的书籍信息

随机推荐

  1. sql grouping with rollup 按部门 合并一
  2. 为什么这个简单的连接查询使用子查询明显
  3. jdbc与mysql之"can't get hostname four
  4. mysql使用kill无法杀死进程
  5. Qt中使用mysql连接远程服务器
  6. SQL 函数如何设置参数默认值
  7. SQL Server更新一行阻止
  8. mysqd实例服务hang住的检测思路及方案
  9. 第73课内幕资料详细版 Spark SQL Thrift
  10. 使用SQL Server 2008提供的表分区向导