szogyenyid / php-builder
一个用于自动为任何类创建Builder的PHP trait。
Requires
- php: >=7.4
Requires (Dev)
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许可证下授权。