runopencode / abstract-builder
实现构建器模式的简单原型类。
1.0.6
2017-03-24 07:26 UTC
Requires
- php: >=7.0
- roave/security-advisories: dev-master
Requires (Dev)
- escapestudios/symfony2-coding-standard: ~2.0
- pdepend/pdepend: ~2.5
- phploc/phploc: dev-master
- phpmd/phpmd: @stable
- phpunit/phpunit: ~6.0
- sebastian/phpcpd: dev-master
- squizlabs/php_codesniffer: ~2.0
- theseer/phpdox: dev-master
README
如果你打算在你的项目中使用构建器模式 (请参阅维基百科上的文章),你可以使用本库中构建器模式的原型实现。
为了做到这一点,你必须创建自己的构建器类,扩展 RunOpenCode\AbstractBuilder\AbstractBuilder
并实现方法 configureParameters
和 getObjectFqcn
。
对于那些特别懒惰的开发者,还有一个 RunOpenCode\AbstractBuilder\ReflectiveAbstractBuilder
,它通过检查构造函数参数和默认值来实现 configureParameters
方法。
注意: 构建器类不得验证提供的参数。应该由要构建的类本身进行此类验证,因为任何类任何实例的构建过程都必须是有效的,无论是否使用了构建器实现。
实现示例
假设我们有一个名为 Message
的类,我们需要为其提供一个构建器类。下面是如何做到这一点
<?php
class Message
{
private $id;
private $message;
private $timestamp;
public function __construct($id, $message, $timestamp)
{
$this->id = $id;
$this->message = $message;
$this->timestamp = $timestamp;
}
}
final class MessageBuilder extends \RunOpenCode\AbstractBuilder\AbstractBuilder
{
/**
* Get builded message.
*
* Alias to \RunOpenCode\AbstractBuilder\AbstractBuilder::build() method.
*
* @see \RunOpenCode\AbstractBuilder\AbstractBuilder::build()
*
* @return object
*/
public function getMessage()
{
return $this->build();
}
/**
* {@inheritdoc}
*/
protected function configureParameters()
{
return array(
'id' => null,
'message' => null,
'timestamp' => new \DateTime('now')
);
}
/**
* {@inheritdoc}
*/
protected function getObjectFqcn()
{
return Message::class;
}
}
构建器使用示例
首先创建一个构建器,你可以使用普通的构造函数
$builder = new MessageBuilder();
或者你可以使用一个静态方法来创建它
$builder = MessageBuilder::create();
你可以通过以下方式获取/设置每个单独配置的构建器属性
属性访问
$builder->id = 1;
$id = $builder->id;
设置方法
$builder->setId(1);
$id = $builder->getId();
数组访问
$builder['id'] = 1;
$id = $builder['id'];
通过数组访问多个属性
$builder->fromArray([ 'id' => 1, 'message' => 'Some message' ]);
$allProperties = $builder->toArray();
$someProperties = $builder->toArray([ 'id', 'message' ]);
最后,你可以通过调用 build()
方法或将构建器作为方法调用来构建具体对象
$message = $builder->build();
$message = $builder();
链式调用(流畅接口)
支持设置方法的流畅接口,因此你可以链式调用它们,例如
$message = MessageBuilder::create()
->setId(1)
->setMessage('Some message')
->setTimestamp(new \DateTime('now'))
->build();