antnee/php-value-objects

PHP中使用值对象的演示

dev-master 2016-01-22 11:53 UTC

This package is auto-updated.

Last update: 2024-09-07 05:13:42 UTC


README

这是一个概念验证,并且是一个非常正在进行中的工作

什么是值对象?

值对象就是一个旨在具有最小功能并保留单个值的对象。在完全面向对象的语言中,所有值都是对象,但PHP不是完全面向对象,所以我们没有这个功能。这个库是PHP中值对象可能实现的一个例子

我们为什么需要它们?

我们不需要!但这不是重点。值对象可能非常有用。在某些语言中,可以扩展其他基本类型,例如,你可以创建一个扩展字符串的电子邮件地址对象。电子邮件地址只是一个字符串,所以所有的字符串函数都应该在电子邮件地址对象上工作。字符串和电子邮件地址之间的唯一区别是电子邮件地址有非常具体的规则来规定哪些是可接受的,哪些是不可接受的。

在PHP中,我们通常会传递一个包含电子邮件地址的字符串,但我们不知道它是否真的是一个电子邮件地址,除非我们在那个步骤中验证它。不幸的是,这通常会导致我们需要在多个步骤中验证,以确保a)它最初确实是一个电子邮件地址,b)它仍然是电子邮件地址。

所以这就是值对象(以下简称VO)发挥作用的地方。如果我们创建一个新的电子邮件地址对象,我们可以将它传递到我们的代码中,并在我们的参数中进行类型提示。例如

function echoEmail(EmailAddress $em)
{
    echo $em;
}

现在这个绝对不是电子邮件地址的机会。这非常有用,因为我们永远不需要验证,只需在我们的函数、类方法等中类型提示参数即可。

如果值发生变化会怎样?

在这个实现中,它不能。对象是不可变的。也就是说,你可以在构造函数中设置它,你可以检索值,但你永远不能改变值。你可以替换它,但你需要用另一个新的电子邮件地址对象来替换它,这也需要被验证。

如果我不喜欢你提供的验证呢?

我不期望你喜欢。我实现了一些简单的验证,但它只是一个例子。你可以添加自己的验证器,只要它实现了PVO\Validators\Interfaces\Validator接口,你就可以编写自己的验证器。你只需要在验证成功时返回true,如果失败则抛出PVO\Exceptions\InvalidValueException

为什么抛出异常?因为如果你的值不合适,我需要比仅仅返回布尔值更引人注目的事情,例如。这需要被捕获并正确处理。目前,VO构造函数本身会抛出一个新的PVO\Exceptions\InvalidValueException,但我很快就会解决这个问题 :)。

实现不多。这有什么用?

这并不是一个旨在应用于你的应用的严肃库,尽管如果它发展到这个状态,我会非常高兴。然而,目的是让人们将其分支出来,添加他们自己的,然后将PR提交给我,这样我们就可以将你的VO添加到库中。也许有一天它会对其他人有用

如何安装

安装当然是通过 Composer 进行的。只需在项目内部执行 composer require antnee/php-value-objects 或者在 composer.json 中添加此命令并运行 composer update

{
    "require": {
        "antnee/php-value-objects": "*"
    }
}

之后,您将拥有最新的开发版本。如果我们最终达到了这个阶段,我会为稳定版本打上标签。