通俗易懂PHP基础【9-类和对象(1)】

云村故事

曾经见过一个摄影师喂藏羚羊喝水,同行的警察把藏羚羊赶走了,摄影师问为什么,警察说,要不然它会以为人类是善良的。

——出自网易云音乐《动物世界》热评

这一节是基础环节中的最后一篇,但由于内容会有很多,为避免引起不适,这最后的一篇会分成三个小篇来介绍。下面就开始我们这边的主题——类和对象。

1

什么是类和对象

关于什么是类,什么是对象。拿我们自己举例来说,我们属于人类,人类就是类,而具体到每一个人这一个体,都是一个个对象。每个人有不同的肤色,身高,胖瘦等这些特征,是人类都有的特征(也称为属性),除了这些特征之外,人类还有会学习,会思考,会走路等这些行为(也成功能或者方法)。

所以说,类要包含属性和方法的集合,这就相当于一个蓝本,有这个蓝本(人类),赋予不同的属性和方法,就能造出各种各样的对象(人)。

可以说,世间万物都是有自己的属性和方法,通过这些属性和方法来分区各种各样的事物。

当然,类是一个抽象概念(正如人类也是一个抽象的概念),实际应用中还需要对类进行实例化来产生对象,对象是类进行实例化后的具体产物。在面向对象编程中,程序是通过对象,对类中的属性和方法进行引用的。

2

面向对象编程的特点

面向对象编程的特点:继承、封装和多态性。

⒈继承

继承的意思就是,类A 继承 类B,那么类A 就是 子类,类B 就是父类。子类 继承父类,子类就可以继承父类中的属性和方法。这在我们编写代码中,可以让我们减少很多不必要代码量的输出,提高开发效率。

例如,把动物看成一个父类,那么动物类具有毛发和四只脚等属性。再定义一个猫类,在定义猫类时完全可以不定义猫也有毛发和四只脚等属性,通过继承,就可以让猫类也有这些属性。

注意:继承使用的关键字是 extends,看如下实例:

可以看到,我们只在动物类中定义了一个毛发属性,让猫类继承动物类,猫类里面属性和方法都没有声明,但由于继承(使用关键字 extends),猫类可以使用动物类的属性,所以实例化(使用 new 关键字)出一只猫的时候,猫可以使用毛发属性,并输出父类的默认值黑色。

⒉封装:

从上面介绍的,我们知道类是属性和方法的集合,我们在类中定义的一个方法,只需通过实例化出对象来调用这个方法就行了,而不用关心这个方法在类中的具体实现,这就是类的封装性。

封装,让我们只在类中定义一次方法,就可以在需要调用的地方,通过实例化出对象来调用方法,而不用再需要方法的地方都要重写一遍代码。封装,也是可以提高开发效率的。

就像一台电视,我们只知道怎么打开和关闭这个功能就行了,而不需要我们知道电视的内部它是怎么实现打开和关闭的功能。

⒊多态

多态性指的是不同的类进行相同的操作会有不能的表现。例如:定义一个为猫类和一个动物类,猫类和动物类都有会吃的行为,说明两者在这方面可以进行相同的操作,然而人类和猫类吃的行为是截然不同的,人类可以拿筷子吃,而猫类不会,有相同吃的操作,但是吃的方法不一样,可以说是多态的形象比喻了。

3

类的创建

类只有声明,对象才有产生的意义。可以说类是面向对象编程的核心基础,是属性和方法的集合。

但在编码中,类必须实例化出对象这一引用才能被使用。

创建类,必须使用关键字class进行声明,该关键字后紧跟类的名称,之后用大括号将类体进行封装。

类体(大括号里)中包括属性和方法的声明及定义,当然也可能在类体中只定义属性或只定义方法,甚至类体内可以不定义任何属性。

完整的类基本的定义格式如下:

<?php

class ClassName{
    //属性
    public $attribute;
    //定义类方法
    public function funcName(){ 
        //定义该方法所要实现的功能
    }
}

?>

属性:类的属性实质为在类体内定义的变量,用于保存或设置参数。

方法:类的方法实质为在类体内定义的函数,用于实现某项功能,其定义方法与普通函数定义方法相同,同时可以应用访问权限关键字( public protected private )对方法访问权限进行限制。

4

构造函数的使用

对类体进行一些初始化操作有两种方法。

第一种方法是在类中我们自定义初始化。

第二种方法就是使用PHP已经在类中定义的析构函数。下面我们分别使用这两种方法来看看:

第一种:自定义初始化方法

<?php

class Student{
  public $grade;//班级
  public $name;//姓名
  public $age;//年龄
 
  public function setStudent($grade,$name,$age){   //属性初始化
    $this->grade=$grade;
    $this->name=$name;
    $this->age=$age;
  }
 
  public function printStudentInfo(){  //输出学生信息
    echo "班级:".$this->grade;
    echo "姓名:".$this->name;  
    echo "年龄:".$this->age."岁";  
  }
}
$student=new Student();
$student->setStudent("二年级","小明","7");   //初始化类的内部成员
$student->printStudentInfo();            //输出结果
?>

运行结果为:班级:二年级姓名:小明年龄:7岁

第二种方法:使用析构函数

<?php

class Student{
  public $grade;//班级
  public $name;//姓名
  public $age;//年龄
 
  public function __construct($grade,$name,$age){   //属性初始化
    $this->grade=$grade;
    $this->name=$name;
    $this->age=$age;
  }
 
  public function printStudentInfo(){  //输出学生信息
    echo "班级:".$this->grade;
    echo "姓名:".$this->name;  
    echo "年龄:".$this->age."岁";  
  }
}
$student=new Student("二年级","小明","7");
$student->printStudentInfo(); //输出结果
?>

运行结果为:班级:二年级姓名:小明年龄:7岁

__construct() 是PHP中构造函数统一的命名,它会在类被实例化成(new xx())对象时自动被调用。

从上面两种方法的对比,通过构造函数来初始化。,当对类实例化出的对象进行初始化时,就位析构函数指定了参数。

注:构造函数是在对类体进行实例化时自动调用的。

5

析构函数的使用使用析构函数

与构造函数对应的是析构函数。

析构函数是在销毁类之前执行,并统一命名__destruct(),其作用是在类被销毁前自动完成某项功能。

实例 see see :如下常用的数据库连接,在我们使用完毕数据库相关操作后,都需要销毁数据库连接占用的资源。如下代码仅供说明,无法运行使用。

<?php
class conn{
  public $host; //主机名
  public $username;//数据库用户名
  public $password;//密码
  public $conn;
  
  public function __construct($host,$username,$password){    //应用构造函数对类体中的属性进行初始化
    $this->host=$host;
    $this->username=$username;
    $this->userpwd=$password;
  }
 
  public function getConn(){      //建立数据库的连接
      $this->conn=MySQL_query($this->host,$this->username,$this-password);
      return $this->conn;
  }
  public function __destruct(){   //应用析构函数自动释放连接资源
      MySQL_close($this->conn);
  }
}
?>

这一小节先就介绍到这里,编写不易,不知道想学编程的你能不能看得懂,有疑问就跟我说吧,毕竟第一次想要坚持写关于PHP的编程知识,想能面面俱到而又能通俗易懂实属不易,但愿我们都能越做越好。

原文发布于微信公众号 - Lemon黄(lemonhunag)

原文发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券