PHP基础语法的学习与个人理解 第三部分

28 阅读5分钟

面向对象

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于"对象"的概念。在PHP中,面向对象编程是一种用于组织和结构化代码的方法。简单解释一下面向对象编程的基本概念:

  1. 对象(Object): 对象是面向对象编程的核心概念。对象是一种数据结构,它包含了数据(称为属性或成员变量)和操作这些数据的代码(称为方法或成员函数)。对象可以看作是现实世界中的实体或抽象概念
  2. 类(Class): 类是对象的模板或蓝图。它定义了对象的属性和方法。类是一种抽象的数据类型,它封装了数据和操作数据的方法。类可以看作是创建对象的工厂
  3. 封装(Encapsulation): 封装是面向对象编程的一项原则,它指的是将数据和相关的操作封装在一个单一的单元(类)中。这意味着对象的内部实现细节对外部是隐藏的,只有通过类的公共接口才能访问对象的功能
  4. 继承(Inheritance): 继承允许一个类继承另一个类的属性和方法。这样,一个类可以在不重复编写相同代码的情况下,扩展或修改另一个类的功能。继承提高了代码的可重用性和可维护性
  5. 多态(Polymorphism): 多态性允许使用相同的接口来处理不同类型的对象。它使得你可以用一个类的实例替换另一个类的实例,而不会影响程序的正确性。多态性提高了代码的灵活性和可扩展性

封装方式与对象调用

封装是面向对象编程中的一个重要概念,它指的是将对象的内部实现细节隐藏起来,只暴露给外部必要的接口。封装的主要目的有以下几点:

  1. 隐藏实现细节: 封装允许你隐藏对象的内部实现细节,只向外部暴露必要的接口。这使得对象的内部结构对于外部代码来说是不可见的,从而提高了系统的安全性和稳定性

  2. 简化复杂性: 封装有助于简化代码的复杂性。外部代码不需要关心对象内部是如何实现的,只需使用对象提供的公共接口。这降低了代码的复杂性,使得代码更易于理解和维护

  3. 提高可维护性: 封装有助于降低代码的耦合度。当对象的内部实现发生变化时,只需要调整与接口有关的部分,而不需要修改外部代码。这提高了代码的可维护性,减少了对整个系统的影响

  4. 提高安全性: 封装有助于控制对对象内部状态的访问。通过使用访问修饰符(public、protected、private),可以限制对属性和方法的访问权限,防止不合理的外部干预,提高了系统的安全性

  5. 提高可重用性: 封装支持代码的模块化和重用。对象的实现细节被封装在一个独立的单元中,这使得该单元可以被其他模块或系统重用,从而提高了代码的可重用性

  6. 支持抽象和继承: 封装是实现抽象和继承的基础。通过将实现细节封装在类的内部,可以实现对对象的抽象描述。继承则允许子类继承父类的接口和一部分实现,以实现代码的重用和扩展

总体而言,封装是一种编程原则,它带来了更清晰、更灵活、更可维护的代码结构。通过遵循封装原则,可以更好地组织代码,提高代码的质量和可扩展性

  • 所谓封装,就是指将一个有特定运行方式的代码块,或者说一段代码,用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();    //赋值完成后,调用并输出运行结果

结合封装和调用两段代码可得到结果为:

image.png

  • 这里每次调用时都需要给属性挨个赋值,非常麻烦。解决办法为在封装时使用构造函数:
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();

得到的结果为:

image.png

本篇为面向对象的个人理解,欢迎指正