此包最新版本(dev-master)没有提供许可证信息。

PHP 5.4+ 的 DCI(数据、上下文和交互)设计模式实现

dev-master 2013-08-15 19:05 UTC

This package is auto-updated.

Last update: 2024-09-19 11:20:27 UTC


README

简而言之,Fatty 是 PHP 的 DCI(数据、上下文和交互)实现。它能够在运行时扩展对象,以最小化对象实例化和负载,仅在需要时提供必要的方法。这对于可能变得相当大的对象非常有用,提供了一种将类分解成更小块的方法。

为什么

随着项目的增长,类通常会变成单体对象。这可能会减慢对象实例化(尽管使用 DCI 模式的性能优势是可疑的),但真正的主要好处是提高了这些对象之间的代码管理。与其有一个包含数百行甚至数千行代码的单个对象,不如简单地提供所有必要的功能,以使对象以基本形式工作(验证规则、关系等),并在所谓的装饰器中提供扩展功能(想想你在用另一个对象的代码装饰对象)。

要求

  • PHP 5.4+

安装

Fatty 可以通过 composer 安装,只需将以下行添加到您的 composer.json 中

{
    "require": {
        "kirkbushell/fatty", "*"
    }
}

然后运行

composer install

这将安装 Fatty 到相关的 vendor 文件夹,并使其可用于您的类。现在,让我们深入了解 - Fatty 究竟能做什么?

让我们以模型的概念作为我们的用例。具体来说,让我们处理一个用户模型。用户可以与各种疯狂的功能相关联,因为我们的大多数应用程序都侧重于用户,但 Fatty 可以用于任何类或对象。

class User extends \Eloquent {
    use \KirkBushell\Fatty\Context;

    public function name() {
        echo $this->first_name . ' ' . $this->last_name;
    }
}

很简单,对吧?我们已经设置了一个名为 User 的类,它有一个基本的方法 name()。因为我们使用了 Eloquent,所以它返回一个字符串,将 first_name 和 last_name 字段聚合在一起。我们可以安全地假设所有用户都将有名字和姓氏,并且可能需要这个方法。

现在,如果我们的 User 类可以代表许多不同类型的用户呢?也许这个用户可以是客户、销售人员,或者可能是农场工人。这三种不同的用户类型代表可能非常不同的功能。例如,我想象不出客户会耕地,或者销售人员会购买产品。因此,当需要这些功能时,我们将扩展 User 对象以提供这些功能。

这提供了两个主要好处

  1. 它确保 User 类更轻,这意味着对象可以更快地实例化,
  2. 它将我们的用户类分解成更小的块,确保代码更容易阅读和管理。

那么我们如何做到这一点呢?很简单。让我们以我们之前提到的农场工人为例 - 给这个用户类型一个名为 plow 的新方法。

class Farmhand {
    public function plow() {
        return function() {
            echo 'Mr Plow, I\'m Mr Plow!';
        };
    }
}

仅就本身而言,这个类什么都不会做 - 但我们可以赋予它目的。让我们获取那个用户对象。

$user = User::find(1);
$user->name(); // Kirk Bushell

$user->extend( 'Farmhand' );
$user->plow(); // Mr plow, I'm Mr Plow!

哇哦... 这太酷了!我们不知怎么地访问了 Farmhand 的方法!这是超级强大的。我们现在可以将大型类分离成当需要某些功能时更有意义的对象。但为什么 plow() 返回匿名函数呢?

PHP 5.3, 5.4 - 以及更高版本!

PHP 5.3 引入了一些非常酷的特性,其中之一就是能够定义匿名函数。这些函数是在需要时定义的。不再需要丑陋的 create_function() 机制了!然而,尽管这个特性非常好——创建能够访问对象内部方法和属性的匿名函数是困难的,它也有其局限性——例如,无法访问定义其上的类中的私有或受保护方法。欢迎来到 PHP 5.4 的闭包对象绑定。这允许我们将匿名函数绑定到对象上下文,在这种情况下——我们的 User 对象,并允许它访问其中的所有功能。我们如何做到这一点呢?

让我们扩展上面的 Farmhand 示例,给它添加一个新方法,该方法将访问用户方法!

public function extendedName() {
    return function() {
        echo $this->name();
        echo . ' the Third';
    }
}

Fatty 当它有一个匿名函数时,会将该匿名函数绑定到 User 对象作用域,允许匿名函数访问 $this 关键字,从而访问 User 所有的方法和功能。

处理参数

我们还没有涉及到参数。我们如何处理它们?很简单。只需确保在声明的匿名函数中定义参数即可。

public function foo() {
    return function( $bar ) {
        echo $bar;
    };
}

然后当我们调用该方法时

$user->foo( 'bar' ); // 'bar'

真的就这么简单!

Laravel 3

Fatty 最初是为了 Laravel 3 而专门构建的,但现在是一个更通用的库。对于 Laravel 3 项目,如果您喜欢捆绑方案,仍然可以使用它;否则,需要在新的 master 分支上做一些手动工作。如果您想查看 Laravel 3 的文档,请检查“旧”分支并从那里开始。

许可证

Fatty 以 MIT 许可证分发,您可以在存储库内部或下面找到它。

MIT 许可证 (MIT)

版权所有 © 2013 Kirk Bushell

特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的个人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及允许软件的接受者进行上述操作,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他方式,无论这些责任是否源于、因之而引起或与软件或其使用或其它交易有关。