• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

PHP 类进行面向对象编程的基础知识

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

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

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

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

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

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

您还可以在类中定义方法,这些方法允许您操纵对象属性的值并对对象执行操作。例如,您可以定义一个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_name、last_name和age。在大多数情况下,类属性是通过实例化对象访问的。

这些属性是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 ();  // 打印'鲍勃' 
echo  $objEmployeeOne -> getLastName ();  // 打印'史密斯' 
echo  $objEmployeeOne -> getAge ();  // 打印'30' 
$objEmployeeTwo  =  new  Employee ( 'John' ,  'Smith' ,  34 );
echo  $objEmployeeTwo -> getFirstName ();  // 打印'约翰' 
echo  $objEmployeeTwo -> getLastName ();  // 打印'史密斯' 
echo  $objEmployeeTwo -> getAge ();  // 打印'34' 
?>

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

PHP 类进行面向对象编程的基础知识  第1张

简而言之,类是您可以用来创建结构化对象的蓝图。

封装

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

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

访问级别

在类中定义属性或方法时,可以将其声明为具有这三种访问级别之一—public、private或protected。

公共访问

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

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

<?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' 
?>

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

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

受保护的访问

最后,当您将属性或方法声明为 时protected,定义它的同一个类和继承相关类的类都可以访问它。我们将在下一节讨论继承,所以我们稍后会回到受保护的访问级别。

继承

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

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

PHP 类进行面向对象编程的基础知识  第2张

在上面的例子中,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声明为公共或受保护的类的所有属性和方法。(它不能访问声明为私有的成员。)

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

接下来,我们callToProtectedNameAndAge使用类中getNameAndAge定义的方法访问了该方法Employee,因为它被声明为受保护的。最后,$employee对象不能访问类的callToPrivateNameAndAge方法,Person因为它被声明为私有的。

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

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

多态性

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

例如,在继承的上下文中,如果子类想要改变父类方法的行为,它可以覆盖那个方法。这称为方法覆盖。让我们快速通过一个真实世界的例子来理解方法覆盖的概念。

<?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>' 
?>

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

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

结论

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

文章目录
  • 什么是面向对象编程 (OOP)?
  • 什么是 PHP 类?
    • PHP 中的类属性
    • PHP 类的构造函数
    • PHP 类的方法
  • 什么是 PHP 中的对象?
  • 封装
    • 访问级别
      • 公共访问
      • 私人访问
      • 受保护的访问
  • 继承
  • 多态性
  • 结论
  • 发表评论