首页 > 文章列表 > 使用类和对象的面向对象PHP

使用类和对象的面向对象PHP

类(class) 对象(object) 面向对象编程(OOP)
426 2023-09-03

在本文中,我们将探讨使用 PHP 类进行面向对象编程的基础知识。

我们将从类和对象的介绍开始,并在本文的后半部分讨论继承和多态性等一些高级概念。

什么是面向对象编程 (OOP)?

面向对象的编程(通常称为 OOP)是一种帮助您以易于长期维护和扩展的方式开发复杂应用程序的方法。在 OOP 的世界中(在 PHP 中创建对象),现实世界中的实体,例如 PersonCarAnimal 被视为对象。在面向对象的编程中,您通过使用对象与应用程序交互。这与过程式编程形成鲜明对比,在过程式编程中,您主要与函数和全局变量交互。

在 OOP 中,有一个“”的概念,它用于将现实世界的实体建模或映射到数据(属性)和功能的模板(方法)。 “对象”是类的实例,您可以创建同一类的多个实例。例如,有一个 Person 类,但许多 person 对象可以是该类的实例 — dan, zainab, hector

该类定义属性。例如,对于 Person 类,我们可能有 nameagephoneNumber。然后每个人对象都会有自己的这些属性值。

您还可以在类中定义方法,以允许您操纵对象属性的值并对对象执行操作。例如,您可以定义 save 方法,将对象信息保存到数据库中。

让我们继续深入学习如何在 PHP 中创建对象。

什么是 PHP 类?

首先我们需要了解什么是 PHP 类。类是代表现实世界实体的模板,它定义实体的属性和方法。在本节中,我们将讨论典型 PHP 类的基本剖析。

理解新概念的最好方法是通过示例。那么让我们看一下下面代码片段中的 Employee 类,它代表员工实体。

<?php
class Employee
{
  private $first_name;
  private $last_name;
  private $age;
 
  public function __construct($first_name, $last_name, $age)
  {
    $this->first_name = $first_name;
    $this->last_name = $last_name;
    $this->age = $age;
  }

  public function getFirstName()
  {
    return $this->first_name;
  }

  public function getLastName()
  {
    return $this->last_name;
  }

  public function getAge()
  {
    return $this->age;
  }
}
?>

第一行中的 class Employee 语句定义了 Employee 类。然后,我们继续声明属性、构造函数和其他类方法。

PHP 中的类属性

您可以将类属性视为用于保存有关对象的信息的变量。在上面的示例中,我们定义了三个属性——first_namelast_nameage。在大多数情况下,类属性是通过实例化对象访问的。

这些属性是 private,这意味着它们只能从 PHP 的类内部访问。这是最安全的属性访问级别。我们将在本文后面讨论 PHP 中类属性和方法的不同访问级别。

PHP 类的构造函数

构造函数是一种特殊的类方法,在实例化对象时会自动调用。我们将在接下来的几节中了解如何实例化对象,但现在您只需要知道构造函数用于在创建对象时初始化对象属性。

您可以通过定义 __construct 方法来定义构造函数。

PHP 类的方法

我们可以将 PHP 中的类方法视为执行与对象关联的特定操作的函数。大多数情况下,它们用于访问和操作对象属性并执行相关操作。

在上面的示例中,我们定义了 getLastName 方法,该方法返回与对象关联的姓氏。

以上就是 PHP 中类结构的简要介绍。在下一节中,我们将看到如何实例化 Employee 类的对象。

PHP 中的对象是什么?

在上一节中,我们讨论了 PHP 中类的基本结构。现在,当你想使用一个类时,你需要实例化它,最终结果是一个对象。因此,我们可以将类视为蓝图,而对象是您可以使用的实际事物。

在上一节中我们刚刚创建的 Employee 类的上下文中,让我们看看如何实例化该类的对象。

<?php
$objEmployee = new Employee('Bob', 'Smith', 30);

echo $objEmployee->getFirstName(); // print 'Bob'
echo $objEmployee->getLastName(); // prints 'Smith'
echo $objEmployee->getAge(); // prints '30'
?>

当您想要实例化任何类的对象及其类名时,您需要使用 new 关键字,并且您将获得该类的新对象实例。

如果一个类定义了 __construct 方法并且它需要参数,则在实例化对象时需要传递这些参数。在我们的例子中, Employee 类构造函数需要三个参数,因此我们在创建 $objEmployee 对象时传递了这些参数。正如我们之前讨论的,实例化对象时会自动调用 __construct 方法。

接下来,我们调用 $objEmployee 对象上的类方法来打印在对象创建过程中初始化的信息。当然,您可以创建同一类的多个对象,如以下代码片段所示。

<?php
$objEmployeeOne = new Employee('Bob', 'Smith', 30);

echo $objEmployeeOne->getFirstName(); // prints 'Bob'
echo $objEmployeeOne->getLastName(); // prints 'Smith'
echo $objEmployeeOne->getAge(); // prints '30'

$objEmployeeTwo = new Employee('John', 'Smith', 34);

echo $objEmployeeTwo->getFirstName(); // prints 'John'
echo $objEmployeeTwo->getLastName(); // prints 'Smith'
echo $objEmployeeTwo->getAge(); // prints '34'
?>

下图是 Employee 类及其一些实例的图形表示。

使用类和对象的面向对象PHP

简单地说,类是一个可以用来创建结构化对象的蓝图。

封装

在上一节中,我们讨论了如何实例化 Employee 类的对象。有趣的是, $objEmployee 对象本身将类的属性和方法包装在一起。换句话说,它向程序的其余部分隐藏了这些细节。在 OOP 的世界中,这称为数据封装。

封装是 OOP 的一个重要方面,它允许您限制对对象的某些属性或方法的访问。这给我们带来了另一个讨论主题:访问级别。

访问级别

在类中定义属性或方法时,可以将其声明为具有这三个访问级别之一publicprivate,或 protected

公共访问

当您将属性或方法声明为公共时,可以从类外部的任何位置访问它。可以从代码中的任何位置修改公共属性的值。

让我们看一个示例来了解公共访问级别。

<?php
class Person
{
  public $name;

  public function getName()
  {
    return $this->name;
  }
}

$person = new Person();
$person->name = 'Bob Smith';
echo $person->getName(); // prints 'Bob Smith'
?>

正如您在上面的示例中看到的,我们已将 name 属性声明为公共。因此,您可以从类之外的任何地方设置它,就像我们在这里所做的那样。

私人访问

当您将属性或方法声明为 private 时,只能从类内部访问它。这意味着您需要定义 getter 和 setter 方法来获取和设置该属性的值。

再次,让我们修改前面的示例以了解私有访问级别。

<?php
class Person
{
  private $name;

  public function getName()
  {
    return $this->name;
  }

  public function setName($name)
  {
    $this->name = $name;
  }
}

$person = new Person();
$person->name = 'Bob Smith'; // Throws an error
$person->setName('Bob Smith');
echo $person->getName(); // prints 'Bob Smith'
?>

如果您尝试从类外部访问私有属性,则会抛出致命错误 无法访问私有属性 Person::$name。因此,您需要使用 setter 方法设置私有属性的值,就像我们使用 setName 方法一样。

您可能有充分的理由希望将财产设为私有。例如,如果该属性发生更改,也许应该采取某些操作(例如更新数据库或重新呈现模板)。在这种情况下,您可以定义一个 setter 方法并在属性更改时处理任何特殊逻辑。

受保护的访问

最后,当您将属性或方法声明为 protected 时,它可以由定义它的同一类以及继承该类的类访问。我们将在下一节中讨论继承,因此稍后我们将回到受保护的访问级别。

继承

继承是面向对象编程范式的一个重要方面,它允许您通过扩展其他类来继承它们的属性和方法。被继承的类称为父类,继承其他类的类称为子类。当实例化子类的对象时,它也会继承父类的属性和方法。

让我们看一下下面的截图来理解继承的概念。

使用类和对象的面向对象PHP

在上面的示例中,Person 类是父类,而 Employee 类扩展或继承了 Person 类,因此称为子类。

让我们尝试通过一个现实世界的示例来了解它是如何工作的。

<?php
class Person
{
  protected $name;
  protected $age;

  public function getName()
  {
    return $this->name;
  }

  public function setName($name)
  {
    $this->name = $name;
  }

  private function callToPrivateNameAndAge()
  {
    return "{$this->name} is {$this->age} years old.";
  }

  protected function callToProtectedNameAndAge()
  {
    return "{$this->name} is {$this->age} years old.";
  }
}

class Employee extends Person
{
  private $designation;
  private $salary;

  public function getAge()
  {
    return $this->age;
  }

  public function setAge($age)
  {
    $this->age = $age;
  }

  public function getDesignation()
  {
    return $this->designation;
  }

  public function setDesignation($designation)
  {
    $this->designation = $designation;
  }

  public function getSalary()
  {
    return $this->salary;
  }

  public function setSalary($salary)
  {
    $this->salary = $salary;
  }

  public function getNameAndAge()
  {
    return $this->callToProtectedNameAndAge();
  }
}

$employee = new Employee();

$employee->setName('Bob Smith');
$employee->setAge(30);
$employee->setDesignation('Software Engineer');
$employee->setSalary('30K');

echo $employee->getName(); // prints 'Bob Smith'
echo $employee->getAge(); // prints '30'
echo $employee->getDesignation(); // prints 'Software Engineer'
echo $employee->getSalary(); // prints '30K'
echo $employee->getNameAndAge(); // prints 'Bob Smith is 30 years old.'
echo $employee->callToPrivateNameAndAge(); // produces 'Fatal Error'
?>

这里需要注意的是,Employee 类已经使用了 extends 关键字来继承 Person 类。现在, Employee 类可以访问 Person 类声明为 public 或 protected 的所有属性和方法。 (它无法访问声明为私有的成员。)

在上面的示例中,$employee 对象可以访问在 getNamesetName 方法>Person 类,因为它们被声明为公共。

接下来,我们使用 getNameAndAge 类中定义的 callToProtectedNameAndAge 方法访问 callToProtectedNameAndAge 方法,因为它被声明为 protected。最后, $employee 对象无法访问 Person 类的 callToPrivateNameAndAge 方法,因为它被声明为私有。

另一方面,您可以使用 $employee 对象来设置 Person 类的 age 属性,就像我们在setAge 方法在 Employee 类中定义,因为 age 属性被声明为 protected。

这就是继承的简要介绍。它可以帮助您减少代码重复,从而提高代码的可重用性。

多态性

多态性是面向对象编程领域的另一个重要概念,它指的是根据对象的数据类型以不同方式处理对象的能力。

例如,在继承的上下文中,如果子类想要更改父类方法的行为,它可以重写该方法。这称为方法重写。让我们快速浏览一个实际示例来了解方法重写的概念。

<?php
class Message
{
  public function formatMessage($message)
  {
    return printf("<i>%s</i>", $message);
  }
}

class BoldMessage extends Message
{
  public function formatMessage($message)
  {
    return printf("<b>%s</b>", $message);
  }
}

$message = new Message();
$message->formatMessage('Hello World'); // prints '<i>Hello World</i>'

$message = new BoldMessage();
$message->formatMessage('Hello World'); // prints '<b>Hello World</b>'
?>

如您所见,我们通过在 BoldMessage 类中覆盖 formatMessage 方法来更改该方法的行为。重要的是,消息的格式根据对象类型的不同而不同,无论是父类的实例还是子类的实例。

注意:一些面向对象的语言还具有一种方法重载,允许您定义具有相同名称但参数数量不同的多个类方法。 PHP 不直接支持此功能,但有一些解决方法可以实现类似的功能。

结论

现在您已经了解了使用 PHP 类进行面向对象编程的基础知识。面向对象编程是一个广阔的主题,我们只触及了其复杂性的表面。我确实希望本教程能帮助您开始了解 OOP 的基础知识,并激励您继续学习更高级的 OOP 主题。

  • 使用类和对象的面向对象PHP

  • 使用类和对象的面向对象PHP

  • 使用类和对象的面向对象PHP

  • 使用类和对象的面向对象PHP

    如何在 HTML 中使用 PHP

    使用类和对象的面向对象PHP

    萨贾尔·索尼
    2022 年 3 月 26 日
  • 使用类和对象的面向对象PHP

    使用 PHP 逐行读取文件

    使用类和对象的面向对象PHP

    蒙蒂·肖肯
    2022 年 7 月 31 日
  • 使用类和对象的面向对象PHP

    PHP 类型转换:完整指南

    使用类和对象的面向对象PHP

    蒙蒂·肖肯
    2021 年 11 月 30 日
  • 无论您使用什么技术,面向对象的编程都是应用程序开发的一个重要方面。今天,我们在 PHP 的背景下讨论了 OOP 的几个基本概念,并借此机会介绍了一些实际示例。

    来源:https://code.tutsplus.com/basics-of-object-oriented-programming-in-php--cms-31910t
    上一篇 使用Python3中的Arcade绘制一个圆形 下一篇 在Python中创建列表字典的方法

    本类最新

    查看更多