PHP课程 - 第13课 - 面向对象编程(OOP)基础
在之前的课程中,我们已经学习过 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 5.2 开始,属性使用关键字 public、protected 和 private 来定义(旧语法使用 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>';
结果是:第一个对象包含数据,而第二个对象为空:
现在你已经知道如何为对象添加数据。接下来我们来了解 方法(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)的基本思想。