曾经见过一个摄影师喂藏羚羊喝水,同行的警察把藏羚羊赶走了,摄影师问为什么,警察说,要不然它会以为人类是善良的。
——出自网易云音乐《动物世界》热评
这一节是基础环节中的最后一篇,但由于内容会有很多,为避免引起不适,这最后的一篇会分成三个小篇来介绍。下面就开始我们这边的主题——类和对象。
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的编程知识,想能面面俱到而又能通俗易懂实属不易,但愿我们都能越做越好。