面向对象
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于"对象"的概念。在PHP中,面向对象编程是一种用于组织和结构化代码的方法。简单解释一下面向对象编程的基本概念:
- 对象(Object): 对象是面向对象编程的核心概念。对象是一种数据结构,它包含了数据(称为属性或成员变量)和操作这些数据的代码(称为方法或成员函数)。对象可以看作是现实世界中的实体或抽象概念
- 类(Class): 类是对象的模板或蓝图。它定义了对象的属性和方法。类是一种抽象的数据类型,它封装了数据和操作数据的方法。类可以看作是创建对象的工厂
- 封装(Encapsulation): 封装是面向对象编程的一项原则,它指的是将数据和相关的操作封装在一个单一的单元(类)中。这意味着对象的内部实现细节对外部是隐藏的,只有通过类的公共接口才能访问对象的功能
- 继承(Inheritance): 继承允许一个类继承另一个类的属性和方法。这样,一个类可以在不重复编写相同代码的情况下,扩展或修改另一个类的功能。继承提高了代码的可重用性和可维护性
- 多态(Polymorphism): 多态性允许使用相同的接口来处理不同类型的对象。它使得你可以用一个类的实例替换另一个类的实例,而不会影响程序的正确性。多态性提高了代码的灵活性和可扩展性
封装方式与对象调用
封装是面向对象编程中的一个重要概念,它指的是将对象的内部实现细节隐藏起来,只暴露给外部必要的接口。封装的主要目的有以下几点:
-
隐藏实现细节: 封装允许你隐藏对象的内部实现细节,只向外部暴露必要的接口。这使得对象的内部结构对于外部代码来说是不可见的,从而提高了系统的安全性和稳定性
-
简化复杂性: 封装有助于简化代码的复杂性。外部代码不需要关心对象内部是如何实现的,只需使用对象提供的公共接口。这降低了代码的复杂性,使得代码更易于理解和维护
-
提高可维护性: 封装有助于降低代码的耦合度。当对象的内部实现发生变化时,只需要调整与接口有关的部分,而不需要修改外部代码。这提高了代码的可维护性,减少了对整个系统的影响
-
提高安全性: 封装有助于控制对对象内部状态的访问。通过使用访问修饰符(public、protected、private),可以限制对属性和方法的访问权限,防止不合理的外部干预,提高了系统的安全性
-
提高可重用性: 封装支持代码的模块化和重用。对象的实现细节被封装在一个独立的单元中,这使得该单元可以被其他模块或系统重用,从而提高了代码的可重用性
-
支持抽象和继承: 封装是实现抽象和继承的基础。通过将实现细节封装在类的内部,可以实现对对象的抽象描述。继承则允许子类继承父类的接口和一部分实现,以实现代码的重用和扩展
总体而言,封装是一种编程原则,它带来了更清晰、更灵活、更可维护的代码结构。通过遵循封装原则,可以更好地组织代码,提高代码的质量和可扩展性
- 所谓封装,就是指将一个有特定运行方式的代码块,或者说一段代码,用
class
关键字装进一个类中,后续需要用到这个代码块时可以直接调用这个类。这一步操作可以使得代码模块化,更方便操作
如何封装
封装的格式:
class 类型名称{
属性;
方法;
}
属性是指在这个代码块中有几个参数要参加运算,而方法决定这些参数以什么方式进行运算。方法一般是用一个函数来定义,例:
class Species{
public $name;
public $gender;
public $age;
public $height;
public $weight;
public $birth;
//以上变量是决定这个代码块有几个参数参加运行,即:属性
function data(){
return '吾名'.$this->name.', '.$this->gender.'性, '.'今年'.$this->age.'岁,'.
'身高'.$this->height.', '.'体重'.$this->weight.'公斤, '.$this->birth.'生人'.'<hr/>';
//用自定义函数data()决定了这个代码块的运行方式,即:方法
}
}
将属性和方法写入类这个操作就叫封装
如何调用
- 对象的概念:
对象是指封装的代码块针对什么而运行。换句话说,谁来执行这个被封装的代码块,例:
$person=new Species();
这里的$person
就是Species
的执行对象,即用$person
来执行上面封装的代码块。
这里的$person=new Species();
并不是直接调用或执行Species
,而是申明$person
来执行Species
- 调用:'王二麻子','男',17,'一米七七',73.5,'1997/9/23'
$person=new Species(); //创建对象为$person(申明$person执行这个类)
//给Species这个类中的属性赋值
$person->name= '王二麻子;
$person->gender= '男';
$person->age= 17;
$person->height= '一米七七';
$person->weight= 73.5;
$person->birth= '1997/9/23';
echo $person->data(); //赋值完成后,调用并输出运行结果
结合封装和调用两段代码可得到结果为:
- 这里每次调用时都需要给属性挨个赋值,非常麻烦。解决办法为在封装时使用构造函数:
class Species{
public $name;
public $gender;
public $age;
public $height;
public $weight;
public $birth;
function __construct($name,$gender,$age,$height,$weight,$birth){
$this->name= $name;
$this->gender= $gender;
$this->age= $age;
$this->height= $height;
$this->weight= $weight;
$this->birth= $birth;
}
function data(){
return '吾名'.$this->name.', '.$this->gender.'性, '.'今年'.$this->age.'岁,'.
'身高'.$this->height.', '.'体重'.$this->weight.'公斤, '.$this->birth.'生人'.'<hr/>';
}
}
这段代码中的function __construct()
就是构造方法,使用构造函数可以减少调用时的操作,直接按顺序传参进属性即可调用。例:
$person=new Species('王二麻子','男',17,'一米七七',73.5,'1997/9/23');
echo $person->data();
这里直接在$person=new Species()
的()
内写实参就完成了赋值,用echo $person->data();
即可,得到的结果是一样的
继承与多态
继承
- PHP 使用关键字 extends来继承一个类通过继承机制,一个类可以从另一个类继承属性和方法,减少了代码的重复编写,提高了代码的可扩展性和灵活性。有时候我们会想更精确的描述一种类型,但是这个新的类型有很多属性 和 函数 都与之前的某一个类型相同。为了提高代码的复用性,减少代码冗余,可以使用extends关键字直接将之前类型中的属性和函数继承过来使用。extends关键字之前的类型称之为子类,extends关键字之后的类型称之为父类
例:
class Dogs extends Species{
public $Hcolor;
public $breeds;
public $Sheight;
public $price;
function __construct($param1,$param2,$param3,$param4,$param5,$param6,$param7){
parent::__construct($param1,$param2,$param3,$param4,$param5,$param6);
$this->Hcolor= $param3;
$this->breeds= $param4;
$this->Sheight= $param6;
$this->price= $param7;
}
function data(){
return '这只狗叫'.$this->name.', 是一只'.$this->gender.'狗,'.'毛色:'.$this->Hcolor.', 品种:'.
$this->breeds.', '.'体重:'.$this->weight.'斤,'.'肩高:'.$this->Sheight.'厘米,'.'身价:'.$this->price.'RMB'.'<br>';
}
}
这里的Dogs
类是Species
的子类,Species
则是父类,这里继承了父类的部分属性。这个操作就叫继承。方法这里用另一种方式运行,则叫多态。多态是指相似的属性以不同的方法运行
现在调用下这个子类:
$b=new Dogs('阿八','母','棕红','泰迪',5.2,26,2000);
echo $b->data();
$t=new Dogs('兔子','母','银灰','泰迪',3.1,22,5000);
echo $t->data();
得到的结果为: