szogyenyid/php-builder

一个用于自动为任何类创建Builder的PHP trait。

1.3.0 2023-05-07 12:09 UTC

This package is auto-updated.

Last update: 2024-09-07 15:23:08 UTC


README

一个用于自动为任何类创建具有流畅接口的Builder的PHP trait。

为什么选择PHP Builder?

Builder是一种创建型设计模式,允许逐步构建复杂对象。Builder设计模式的意图是将复杂对象的构建与其表示分离。它是GoF(四人帮)设计模式之一。

由于PHP不支持内部类(如Java所做),如果您想创建Builder,您必须为每个想使用Builder的类编写一个新类,并在基类发生变化时维护它们。通过使用PHP Builder,您不需要在您的命名空间中创建单独的Builder类。

PHP Builder可以帮助防止一些错误,因为变量只在实例化时访问一次,此时属性值已经设置。此外,不需要编写任何公共设置器,这会使类可变或易受攻击。在调用build()方法之前,没有任何实例是可访问的,在调用它之后,不能从外部实例更改任何属性(除非它们是公共的或具有公共设置器)。

而不是这样,没有使用PHP Builder

class User
{
    private string $name;
    private string $email;

    public function setName(string $newName): void
    {
        $this->name = $newName;
    }
    public function setEmail(string $newEmail): void
    {
        $this->email = $newEmail;
    }
}

$user = new User();
$user->setName("John Doe");
$user->setEmail("john.doe@example.com");

如果您使用PHP Builder,则必须编写此内容

class User
{
    use Builder;

    private string $name;
    private string $email;
}

$user = User::builder()
    ->withName("John Doe")
    ->withEmail("john.doe@example.com")
    ->build();

在第一种情况下,您必须编写公共设置器,这会使类在创建后可变。在第二种情况下,没有设置器,属性是私有的,因此没有机会在创建后更改它们。

它还可以提高代码的可读性,因为您获得了一个流畅的接口,并且可以消除变量名的重复。

安装

通过Composer安装是最简单的

$ composer require szogyenyid/php-builder

或手动将其添加到您的composer.json文件中。

升级

PHP Builder遵循语义版本控制,这意味着在主要版本之间可能发生破坏性更改。由于当前最高版本是V1,您目前不需要担心版本。

用法

要自动获取对Builder的访问权限,只需将trait添加到您的类中即可

class User
{
    use Builder;
    
    //...
}

您的类无需遵循任何规则即可使用Builder,不需要设置器或公共属性。

class User
{
    use Builder;

    private string $name;
    private string $email;
}

上面的示例是100%有效,可以使用Builder的类。

拥有它将提供对Builder的访问权限,如下所示

$user = User::builder()
    ->withName("John Doe")
    ->withEmail("john.doe@example.com")
    ->build();

Builder的所有方法都将遵循属性名的命名,并在前面添加with。为了提高可读性,您可以更改属性名的第一个字母为大写(而不是withname,您可以使用withName)。

可能出现的错误

如果Builder遇到任何错误,将抛出BuilderException

如果您调用一个不以with开头的Builder方法(除build()reset()外),将抛出以下消息的异常

Builder method names must start with "with". Invalid method name: $methodName

如果找不到具有相应名称的属性,将随BuilderException发送以下消息

No property with name "$property" found in class $class

许可

PHP Builder在MIT许可证下授权。