PHP:现实世界中的OOP范例(PHP: Real world OOP example)

2019-07-03 22:30发布

我努力学习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(注册,登录,用户帐户等)?

Answer 1:

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按照预期方式) -这通常被称为合同 。 实例*DirectoryRenderer并不关心哪种类型的实例*DirectoryIterator收到,也没有实例*DirectoryIterator关于他们是如何被渲染照顾。

为什么? 因为我们设计他们的方式。 他们只需将其插入到对方和工作。 这是在行动OOP。



Answer 2:

购买一本书像“PHP和MySQL的日常应用傻瓜”。

它的老,我知道[2005],但它显示了这两个程序用户登录,论坛,购物车等概念和对象与mysqli的导向。

它帮助我学习面向对象的PHP,我研究了很多。 很值得的钱。

OOP很像分组程序的位为可重复使用的部分。 它不是很难跟你说实话它只是包装您的功能集成到类的想法。

以下面向对象的东西现实世界中的小例子:

级数据库
上课时
CLASS的WebForms
级电子邮件

CLASS帐目(下面的实施例的功能)
功能SELECTACCOUNT
功能CHECKPASSWORD
功能CHECKUSERNAME
功能的createAccount

我希望你能坚持下去,PHP 6将被重新设计,以支持面向对象比以往任何时候都多。

祝好运!



Answer 3:

虽然我知道这个问题已经已经回答了,我觉得好像我可以在这里添加值。

我不认为你应该使用PHP作为一种编程语言来学习OOP。 如果您想了解Web应用程序的OOP,你应该寻找在C#或Java。 一旦你学会OOP,那么你可以申请这方面的知识到PHP。 一本书的一个例子,我要学OOP是Big Java by Cay S. Horstmann

我为什么说这个??? 因为有数以百万计的关于如何做的东西PHP的例子,但是没有多少是如何正确的程序示例。 继此,PHP允许你采取许多快捷键,也不会与Java的喜欢接受的。 因此,如果你有一个Java编程头PHP,那么我相信你会成为一个更加强大的程序员。 OOP是不特定的语言,它是一种编程范式。

如果你必须使用PHP学习OOP,那么我会建议你采取github上的公共库看看一些真正的源代码。 您可以在packagist.org搜索。 如果他们是一个体面的公共仓库,它们将包含一个readme.md文件,该文件会告诉你如何使用作曲家包。 例如https://github.com/moltin/laravel-cart是购物车软件包,你就可以在你的应用程序中使用的一个例子。 请注意,你怎么不需要看包的源代码,以了解包做。 该包已被写入了,你不关心他们的工作,但你使用它们,所以你只需要知道如何使用它们。 这正是OOP左右。

我不在乎购物车类是如何将一个项目添加了车,我只是想创建一个新的购物车,并添加什么东西。

但是什么你正在做的是深入到源代码作为一种工具来理解OOP是如何工作的。

另外此,可能更重要的是,Web应用开发,我会研究MVC设计模式。

MVC设计模式的代表模型,视图,控制器。 凡在Web应用程序的情况下,模型是负责数据库建模,视图是负责显示内容给用户。 控制器负责与模型交互和处理用户输入。

那么我想你应该尝试安装Laravel框架在本地计算机上或其他“体面的现代框架”。 为什么我说现代,因为现代的框架需要5.3+这意味着你的机器上的PHP将支持类似于你会从Java的喜欢得到真正的OOP一个minumum PHP版本。

有很多教程将告诉你如何在laravel构建Web应用程序。 随即,你会看到,当你创建一个控制器,扩展BaseController。 当你创建一个模型,您扩展侃侃而谈。 这意味着你将已经在你的代码中使用多态。 你会看到,用类,它们都被封装,并且你会看到,每个类都有一个特定的角色。

当您希望与数据库交互,您将首先创建一个new Model的控制器方法中的对象。 当你开始了解更多,你将开始学习如何依赖注入控制器,然后学习如何甩掉你的模型,并建立信息库和程序,而不是接口。

学习Laravel初学者一个体面的书会被https://leanpub.com/codebright由戴尔·里斯。 我在Laravel聚会满足戴尔大约2个星期前。

继此,当你变得更加熟练构建Web应用程序,你会开始学习如何遵循以下原则,以你的编程:

  • 单一职责原则
  • 开闭原则
  • 里氏替换原则
  • 接口Segragation原理
  • 依赖倒置原则


Answer 4:

作为astropanic说,你可以看看在一个良好的PHP框架或库的源代码。 我建议Zend框架 ,这是非常模块化的,有一个伟大的,专业的设计。 我会说这是一个非常好的一块面向对象的PHP代码。

不过,我认为这不是那么容易从一块巨大的生产代码来学习,因为它并没有真的让教你任何东西。 但如果你想真实世界的面向对象的PHP代码,Zend框架(或Symfony的,也许CakePHP的)可能是要走的路。



Answer 5:

我建议你在这一刻远离任何框架了,如果你不知道OOP,挖掘到Zend或任何其他的框架将太多。

PHP OOP是退出好笑......像哈哈有趣,因为它的支持,但PHP是不是如Java或C#中的OOP语言。

简短的例子只是为了强调我的发言:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

但如果你想“飞”做OOP你可以做到以下几点:

$user = (object) array('name' => 'Peter');

然后

$user->name;

但你可以使用OOP,就像您在Java或C#,但不相同的扩展 - 与心目中,流行的系统,例如WordPress和Drupal不是纯粹的OOP! 但你可以做的继承和其他分级面向对象的东西在PHP中也是如此。



Answer 6:

我没有在PHP OOP走多远,但我越进入它变得更容易。 这些对象的例子就在那里让你了解OOP是如何工作的。 我的理解和之前通过这个过,OOP是只是属性和方法(正常的变量和函数)。 我在真正面向对象程序性自己从我的教程应用实例,并不一定必须要在现实世界中。 这就像被勺子喂,你永远也无法理解OOP和会很容易忘记。 我的建议是学会理解。 如果你明白了,你可以做任何事情,并会实现OOP的力量。 我下载了这本书,我想你也应该这么做。 但是,这就像一个人构建的应用程序为你...

这里的链接书PHP和MySQL的日常应用傻瓜



Answer 7:

我建议也看看我的包装Arrayzy 。 这是一个在面向对象的方式是原始的PHP阵列容易操作库。

所以,如果你有本地的PHP阵列职能的工作 - 你可以做同样的事情在OOP和Arrayzy帮助你用它,例如:

// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);

// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();

在这两种情况下,结果阵列将是:

Array(
    0 => 'a'
    1 => 'b'
    2 => 'c'
    3 => 'c'
    4 => 'd'
)

检查请问这是怎么mergeWith方法(或其他方式)的引擎盖下工作。

我觉得这是一个很好的例子表明,几乎所有的功能代码,你可以用面向对象的代码替换像这个库。 但随着OOP你得到更多 ,你也可以查看函数式编程VS OOP的问题,以了解更多详细信息,什么是缺点和它的道具。



文章来源: PHP: Real world OOP example
标签: php oop