gpt4 book ai didi

PHP:现实世界的 OOP 示例

转载 作者:IT王子 更新时间:2023-10-29 00:51:10 26 4
gpt4 key购买 nike

我正在尝试学习 OOP。我正在阅读的书中所谓的“现实世界”示例无济于事。

PetCarHuman 等所有示例都不再帮助我了。我需要现实生活中的示例,例如注册、用户个人资料页面等。

一个例子:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

我还看过:

$user->user = (array) $_POST;

哪里:

private $user = array();

将所有信息保存在一个数组中。

在同一个类中

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using
//the user id.

是否有在许多不同的 php 应用程序(注册、登录、用户帐户等)中实现 OOP 的真实示例?

最佳答案

OOP 不仅仅是关于单个类的外观和操作方式。它还涉及一个或多个类的实例如何协同工作。

这就是为什么你会看到这么多基于“汽车”和“人”的例子,因为它们实际上很好地说明了这一原则。

在我看来,OOP 中最重要的一课是封装多态性

封装:以简洁、合乎逻辑的方式将数据和作用于该数据的逻辑耦合在一起多态性:一个对象看起来像和/或行为像另一个对象的能力。

一个很好的现实世界的例子就是目录迭代器。这个目录在哪里?也许它是一个本地文件夹,也许它像 FTP 服务器一样是远程的。谁知道呢!

这是一个演示封装的基本类树:

<?php

interface DirectoryIteratorInterface
{
/**
* @return \Traversable|array
*/
public function listDirs();
}

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
protected $root;

public function __construct($root)
{
$this->root = $root;
}
}

class LocalDirectoryIterator extends AbstractDirectoryIterator
{
public function listDirs()
{
// logic to get the current directory nodes and return them
}
}

class FtpDirectoryIterator extends AbstractDirectoryIterator
{
public function listDirs()
{
// logic to get the current directory nodes and return them
}
}

每个类/对象都有自己的检索目录列表的方法。数据(变量)与使用数据的逻辑(类函数,即方法)耦合。

但故事还没有结束 - 还记得我说过 OOP 是关于类的实例如何协同工作,而不是任何单个类或对象吗?

好的,让我们用这些数据做点什么——把它打印到屏幕上?当然。但是怎么做? HTML?纯文本? RSS?让我们解决这个问题。

<?php

interface DirectoryRendererInterface
{
public function render();
}

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
protected $iterator;

public function __construct(DirectoryIteratorInterface $iterator)
{
$this->iterator = $iterator;
}

public function render()
{
$dirs = $this->iterator->listDirs();
foreach ($dirs as $dir) {
$this->renderDirectory($dir);
}
}

abstract protected function renderDirectory($directory);
}

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
protected function renderDirectory($directory)
{
echo $directory, "\n";
}
}

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
protected function renderDirectory($directory)
{
echo $directory, "<br>";
}
}

好的,现在我们有几个用于遍历和呈现目录列表的类树。我们如何使用它们?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
new LocalDirectoryIterator('/home/pbailey')
);
$data->render();

现在,我知道你在想什么,“但是彼得,我不需要这些大类树来做这件事!”但如果你这么认为,那么你就错过了重点,就像我怀疑你一直在用“汽车”和“人”的例子一样。不要专注于示例的细节 - 而是尝试了解这里发生了什么。

我们创建了两个类树,其中一个 (*DirectoryRenderer) 以预期的方式使用另一个 (*DirectoryIterator) - 这通常被称为 < em>契约(Contract)。 *DirectoryRenderer 的实例不关心它接收到哪种类型的 *DirectoryIterator 实例,*DirectoryIterator 的实例也不关心它们如何接收'正在渲染。

为什么?因为我们就是这样设计它们的。他们只是相互连接并工作。 这是实际的 OOP

关于PHP:现实世界的 OOP 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1343619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com