PHP:真实世界的OOP示例

BDu*_*elz 46 php oop

我正在努力学习OOP.我正在阅读的书中所谓的"现实世界"例子并没有帮助.

所有的例子一样Pet,Car,Human不能帮助我了.我需要真实的生活例子,如注册,用户个人资料页面等.

一个例子:

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

我也看到了:

$user->user = (array) $_POST;
Run Code Online (Sandbox Code Playgroud)

其中:

private $user = array();
Run Code Online (Sandbox Code Playgroud)

保存数组中的所有信息.

在同一个班级里面

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

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

Pet*_*ley 81

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
    }
}
Run Code Online (Sandbox Code Playgroud)

每个类/对象负责其自己的检索目录列表的方法.数据(变量)耦合到使用数据的逻辑(类函数,即方法).

但故事还没有结束 - 还记得我怎么说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>";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

// 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();
Run Code Online (Sandbox Code Playgroud)

现在,我知道你在想什么,"但彼得,我不需要这些大班树来做这件事!" 但如果你认为那么你就错过了这一点,就像我怀疑你曾经使用过"汽车"和"人物"的例子.不要只关注这个例子的细枝末节 - 而是试着去理解这里发生的事情.

我们创建了两个类树,其中one(*DirectoryRenderer)*DirectoryIterator以预期的方式使用other() - 这通常被称为契约.一个实例*DirectoryRenderer不关心*DirectoryIterator它接收哪种类型的实例,也不*DirectoryIterator关心它们如何被渲染.

为什么?因为我们就是这样设计的.他们只是互相插入并工作.这是OOP的实际应用.

  • +2,如果我能!! (11认同)

小智 9

购买像"PHP和Mysql日常应用程序的傻瓜"这样的书.

我知道它[2005],但它在过程和面向对象的Mysqli中显示了用户登录,论坛,购物车等的概念.

它帮助我学习面向对象的PHP,我研究了很多.非常物有所值.

OOP非常类似于将程序的各个部分分组为可重用的部分.与你说实话并不难,只是将你的功能打包成课程的想法.

以下OOP内容的真实世界迷你示例:

级数据库
课堂授课
类的WebForms
级电子邮件

CLASS ACCOUNTS(下面的示例函数)
功能SELECTACCOUNT
FUNCTION CHECKPASSWORD
功能CHECKUSERNAME
功能CREATEACCOUNT

我希望你坚持下去,PHP 6将重新设计,比以往任何时候都更加支持OOP.

祝好运!