logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

PHP课程 - 第13课 - 面向对象编程(OOP)基础

09/10/2025, by Ivan

在之前的课程中,我们已经学习过 PHP 的几种数据类型:布尔型、整型、浮点型、字符串和数组。在本课中,我们将了解 PHP 中另一种非常重要的数据类型 —— 对象(object)
对象在某种程度上类似于数组,因为对象中也可以包含不同类型的数据,比如数字、文本、数组,甚至其他对象。

对象就像数组一样可以包含各种数据,这些数据称为对象的 属性(properties)。同时,对象还可以包含函数,这些函数称为 方法(methods)

不过,对象与数组有两个显著的区别:

1. 对象可以包含方法。

方法是以对象的名义调用的函数。将函数绑定到对象,使得对象不仅可以存储数据,还可以定义能够对这些数据执行的操作。

2. 对象是从类创建的。

在创建对象之前,我们必须先定义一个 类(class)。类中描述了对象将拥有的属性和方法。这样我们就能明确对象的结构,清楚对象应该保存哪些数据以及可以执行哪些操作。当我们通过类创建对象时,可以在创建时为对象赋予初始值,这样新生成的对象就不是空的。

对象是最方便的数据容器之一。它们使我们可以以更贴近现实世界的方式组织数据。例如,我们的数据库中保存了关于书籍的信息。一本书有作者、页数、出版社、版次、简介、印刷信息等。为了方便处理这些数据,我们可以创建一个 Book 类(书籍类),并在其中定义这些属性。这样,我们就能创建出类似真实世界中“书”的对象。这种方法在开发网站时尤其方便,因为我们常常把数据存储在数据库表中,而表名和字段名可以与类名和属性名对应,从而让数据操作更加直观。

接下来我们将通过示例更详细地了解对象与数组的区别。

PHP 5.2 及以上版本:

让我们从定义一个 类(class) 开始。注意类名通常用单数形式,而对象可以有多个。这说明:一个类可以创建多个对象(实例)。

<?php
class book{

}
?>

通过 class 关键字我们定义了一个类。现在我们来创建对象:

<?php
class book{
  
}

$book1 = new book;
$book2 = new book;
print_r($book1);
print_r($book2);
?>

通过 new 关键字,我们创建了两个属于类 book 的对象。每个对象都是类的一个 实例(instance)。因此我们现在有两个实例:$book1 和 $book2。我们使用 print_r() 输出对象的内容,可以看到如下结果:

PHP 对象

可以看到,PHP 告诉我们对象属于哪个类。如果对象中有数据,它们也会被输出。现在让我们为类添加一些数据(属性)。

从 PHP 5.2 开始,属性使用关键字 publicprotectedprivate 来定义(旧语法使用 var,稍后会讲)。如果你使用过 Delphi 或 C++,这些关键字的含义应该很熟悉。

  • public:公有属性和方法,类的实例可以直接访问。
  • protected:受保护的属性和方法,只能在类本身及其子类中访问。
  • private:私有属性和方法,只能在当前类中访问,子类也无法访问。

我们暂时全部使用 public 来定义属性:

class book{
  public $author;
  public $numberOfPages;
  public $year;
  public $publishingOffice;
  public $editionNumber;
}

现在类中定义了属性,因此可以在对象中直接操作这些属性:

class book{
  public $author;
  public $numberOfPages;
  public $year;
  public $publishingOffice;
  public $editionNumber;
}

$book1 = new book;
$book1->author = 'Abramenko I.A';
$book1->numberOfPages = 192;
$book1->year = 2013;
$book1->publishingOffice = 'Moscow';
$book1->editionNumber = 1;
$book2 = new book;
print '<pre>';
print_r($book1);
print_r($book2);
print '</pre>';

结果是:第一个对象包含数据,而第二个对象为空:

PHP 对象示例

现在你已经知道如何为对象添加数据。接下来我们来了解 方法(methods)。方法是定义在类内部的函数,可以通过对象来调用。

<?php

class book{
  public $author;
  public $numberOfPages;
  public $year;
  public $publishingOffice;
  public $editionNumber;
  public function getAuthor(){
    return $this->author;
  }
  public function getNumberOfPages(){
    return $this->numberOfPages;
  }
  public function getYear(){
    return $this->year;
  }
  public function getPublishingOffice(){
    return $this->publishingOffice;
  }
  public function getEditionNumber(){
    return $this->editionNumber;
  }
}

$book1 = new book;
$book1->author = 'Abramenko I.A';
$book1->numberOfPages = 192;
$book1->year = 2013;
$book1->publishingOffice = 'Moscow';
$book1->editionNumber = 1;
print '<pre>';
print $book1->getAuthor() . '<br />';
print $book1->getNumberOfPages() . '<br />';
print $book1->getYear() . '<br />';
print $book1->getPublishingOffice() . '<br />';
print $book1->getEditionNumber() . '<br />';
print '</pre>';
?>

注意这里的 $this 变量。它代表当前对象的实例。也就是说,在类内部,$this->author 等价于对象的属性,例如 $book1->author。但 $this 只能在类内部使用。

接下来我们添加两个显示方法,一个使用表格格式,一个使用 div 格式。

class book{
  public $author;
  public $numberOfPages;
  public $year;
  public $publishingOffice;
  public $editionNumber;

  public function getAuthor(){ return $this->author; }
  public function getNumberOfPages(){ return $this->numberOfPages; }
  public function getYear(){ return $this->year; }
  public function getPublishingOffice(){ return $this->publishingOffice; }
  public function getEditionNumber(){ return $this->editionNumber; }

  public function displayTable(){
    $content = '<table border="1">';
    $content .= '<tr><td>Author</td><td>'. $this->getAuthor() . '</td></tr>';
    $content .= '<tr><td>Pages</td><td>'. $this->getNumberOfPages() . '</td></tr>';
    $content .= '<tr><td>Year</td><td>'. $this->getYear() . '</td></tr>';
    $content .= '</table>';
    return $content;
  }
}

然后我们再添加 displayUnformatted() 方法输出 div 格式。

PHP 5.1.3 及以下版本:

旧版本的 PHP 使用 var 来定义类属性:

<?php
class myClass{
  var $myArray = array();
}
?>

然后我们可以定义方法并创建对象,通过箭头符号 -> 访问属性与方法:

<?php
class WorkWithArray{
  var $myArray = array();
  function increment_all_elements($newArray){
    foreach($newArray as $key){
      $newArray[] = $key+1;
    }
    return $newArray;
  }
}

$myObject = new WorkWithArray;
$myObject->myArray = array(2,4,6,7);
$myObject->myArray = $myObject->increment_all_elements($myObject->myArray);
print_r($myObject);
?>

通过这种方式,我们成功地创建了一个对象、定义了它的属性和方法,并使用它们来处理数据。这就是 PHP 面向对象编程(OOP)的基本思想。