mangelsnc/specific-class-collection

抽象类,用于构建特定类型集合类

dev-dev 2019-04-12 08:19 UTC

This package is auto-updated.

Last update: 2024-09-12 20:00:21 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

SpecificClassCollection

安装

只需执行

composer require mangelsnc/specific-class-collection

描述

此抽象类允许您创建特定类的集合。

您在Java中是否见过类似的情况?

public String join (ArrayList<String> collection) {
    String joinedString = '';
    
    for (String temp : collection) {
        joinedString.concat(temp);
    }
    
    return joinedString;
}

拥有一个确保其中包含的所有对象都属于某个特定类的集合非常有用。

PHP缺少这样的功能,我们被迫编写不优雅的代码,如下所示

<?php

namespace Solid\ApplicationService;

use Solid\ApplicationService\ValidatorRules\IdentityNumberValidatorRuleInterface;

class IdentityNumberValidator
{
    private $validators;
    
    public function __construct($validators = [])
    {
        foreach ($validators as $validator) {
            if ($validator instanceof IdentityNumberValidatorRuleInterface) {
                $this->validators[$validator->getClassName()] = $validator;
            }
        }
    }
    
    // more code
}

在这种情况下,我们想将验证器集合传递给构造函数,但在PHP中并没有简单的方法来做这件事,因此,我们在同一个构造函数中执行类型的验证。

这并不优雅,而且更重要的是,如果传递给构造函数的数组中没有实现所需接口的项目,这些验证器可能无法正常工作。

使用集合,可以重构旧的构造函数为以下形式

<?php

namespace Solid\ApplicationService;

use Solid\ApplicationService\ValidatorRules\IdentityNumberValidatorRuleCollection;
use Solid\ApplicationService\ValidatorRules\IdentityNumberValidatorRuleInterface;

class IdentityNumberValidator
{
    private $validators;
    
    public function __construct(IdentityNumberValidatorRuleCollection $validators)
    {
        foreach ($validators as $validator) {
            $this->validators[$validator->getValidClassName()] = $validator;
        }
    }
    
    // more code
}

留下一个干净的构造函数,并将类型验证委托给正确的地方。

注意:集合可以像数组一样迭代,或者如果您喜欢,可以调用getElements方法来获取数组。

创建集合类

使用这个小小的辅助工具,创建特定集合类就像这样简单

<?php

namespace Solid\ApplicationService\ValidatorRules;

use SpecificClassCollection\SpecificClassCollection;
use Solid\ApplicationService\ValidatorRules\IdentityNumberValidatorRuleInterface;

class IdentityNumberValidatorRuleCollection extends SpecificClassCollection
{

    protected function getValidClassName()
    {
        return IdentityNumberValidatorRuleInterface::class;
    }
}

操作集合

向集合中添加元素

$collection = new IdentityNumberValidatorRuleCollection();
$collection->add($rule);
$collection->add($rule);

获取集合中的元素数量

$collection->count();

重置集合内容

$collection->clear();