PHP Manual
/
PHP中的OOP系列

PHP中面向对象编程的介绍

01. 01. 2020

欢迎来到在线课程《PHP中的OOP》的第一篇文章。有关完整的文章清单,请访问概览页

内容说明:

这个系列的目标是最好地解释面向对象编程的精髓,这样你就不必花几百个小时去实验那些没有意义的东西了。所有的技术和教程都来自于实践,并按照我自己在学习编程时的想法来解释。一些的概念被大大简化*,以牺牲100%的事实正确性为代价,因为我相信,**主要理解原则,至少对问题有一些了解,总比迷失在编程中,把一切都看成一个大麻烦要好。

你很快就会看到,用OOP编程对你的代码有巨大的好处。它将为你的应用程序带来一个新的抽象水平,并允许你解决非常复杂的问题,而这些问题是其他方式无法实现的。

什么是物体

在编程的基本概念中,对象是特殊的数据类型,除了自身的价值外,还可以定义详细的状态、方法、行为,并允许你进行各种操作,就像现实世界中一样。

编程中的对象是类似于现实世界中的 "东西",我们可以为其命名(例如,通过一个名词),并具有类似于现实世界中事物的属性。例如,一个对象可以是一篇文章,它有一些值(标题、内容、作者、出版日期,......)和方法(插入新的标题、阅读内容、计算出版后的天数,......)。在这篇文章中,我们将主要讨论如何在基本水平上创建和使用该对象。

对象和类别

正如我们已经确定的,物是存在的东西。在这个阶段,"存在 "这个词非常重要,因为我们很快就会看到,在编程中仍有一个实际的实现需要处理。

因为在编程中,我们是在写代码,而对象是 "活 "的东西,从这一点开始,我们将区分两个不同的概念,在这里,详细了解其含义并严格区分是很重要的。

  • 一个对象是 "活着的 "东西,它现在就存在(有一个实例),并且可以执行一些东西或对其他对象作出反应。
  • 一个是静态编写的代码,还没有被评估,并且一直保持不变。

由于我们在编程时总是把代码写成静态字符串(文本),我们将把程序区分为 "类"(整个对象的静态定义)和 "对象"(类的一个 "活 "实例)。

类定义的例子。

class Article
{
public string $title;
public ?string $autor = null;
}

实践说明:

在真正的应用中,每个类通常被写入一个单独的PHP文件,该文件的名称与类的名称相同。

因此,对于文章'类,例如,我们创建src/Article.php`。这个约定在PHP中不是必须的,但它有助于使应用程序更易读,这样你就不会把很多代码放在一起了。

每个类在整个应用程序中最多只能存在一次(有一个唯一的名字),但可以有(几乎)无限多的实例(取决于RAM容量)。此外,一个类不能被分割成多个文件,必须在一个地方一次性定义。如果你需要创建多个同名的类,请使用命名空间

我们还将在后面说明,结构良好的代码将允许它在许多项目中被重用。

这段代码定义了一个有两个属性(title'和author')的`Article'类。 PHP忽略了注释,只将其用于静态类型检查(通常由PhpStorm读取)。

代码。

public string $title;

指的是properties的定义,它是Article类的一个属性。我们可以认为Article'是一种字段,title'是它的索引,我们可以在其中写入一个值。每个属性都必须有一个可访问性定义("公共"、"保护 "或 "私人"),我们将在后面解释每个设置的含义。如果你不知道在特定情况下选择哪种可访问性,那就填上 "public"。

实例化一个类并创建一个对象

实例 "的概念是最难理解的概念之一,所以你一定要仔细阅读下面几行,我建议你对所有的例子进行公平的尝试。

如果我们的应用程序已经在源代码中定义了一个类,那么它并没有真正用于任何地方,PHP也不知道它。这是因为OOP引入了 "数据封装原则",这意味着一个类有一个只在该类内部有效的内部(局部)环境。这是因为在无对象开发中,我们习惯于总是评估代码的整体性。另外,试着把一个类看成是某种形式的函数或外部调用的程序。

现在我们可以创建我们的第一个实例,使用newnew操作符来完成。

$myArticle = new Article;
$myArticle->title = '我的第一篇文章'; // 写入该值
echo $myArticle->title; //列出 "我的第一篇文章"

注意,我们把由new操作符创建的整个Article对象放入$myArticle变量中。这对我们来说意味着该对象实际上是一个 "数据类型",所以我们可以在变量之间移动它并继续使用它。

->箭头操作符用于操作对象。如果我们有一个特定对象的实例(我们有一个包含其内容的变量),我们可以很容易地向内部属性写值,或读取它们,或使用方法(我们将在后面看到)以各种方式改变它们。

一个对象的实例是在内存中创建一个类的本地 "活 "副本(变量)

同时创建同一个类的多个实例

正如我们已经讨论过的,每个对象都有一个适用于其内部的局部环境。由于这一原则,我们可以创建同一类别的许多独立实例,并自由地操纵它们。我们甚至可以创建一个动态数量的实例,例如,将它们存储为数组元素。这种可能性是无限的。

警告:

当创建极端数量的实例时(数百个或更多),请记住内存占用,因为 PHP 需要在 RAM 中保存所有实例的信息。然而,在实践中,由于许多实例而导致的内存溢出问题并没有发生。

例子。

$firstArticle = new Article;
$firstArticle->title = '我的第一篇文章';
$secondArticle = new Article;
$secondArticle->title = '关于一只狗和一只猫';
echo $firstArticle->title; //列出 "我的第一篇文章"
echo $secondArticle->title; //写出了 "关于一只狗和一只猫"

注意,title'(->title')属性的列表取决于我们从哪个实例读取。

摘要

我们已经展示了如何定义我们的第一个类,并创建一个它的实例(一个对象),我们已经把几个值写入其中。

在下一期,我们将解释构造器、方法和传递输入的概念。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024