navcon/utility

此包提供各种PHP接口和类,用于结构化和组织数据以及对象组

1.1.0 2017-05-25 16:43 UTC

This package is auto-updated.

Last update: 2024-08-29 03:36:04 UTC


README

关于

此包提供各种PHP接口和类,用于结构化和组织数据以及对象组。

功能

  • 迭代器
    • 迭代器感知
    • 迭代器反转
    • 迭代器限制
    • 分页器
  • 迭代器装饰器抽象类
    • 迭代器装饰器反转
    • 迭代器装饰器限制
    • 分页器装饰器
  • 集合
    • 集合装饰器
  • 数组列表
  • 映射
    • 哈希映射
    • 树映射
  • 集合
    • 哈希集合
  • 枚举器
  • 组合

致谢

此包受到java.util包的启发。这些概念已经调整以适应PHP世界。

兼容性

  • PHP5.3

安装

使用composer安装最新版本

composer require naucon/utility

示例

启动内置的Web服务器以查看示例

cd examples
php -S 127.0.0.1:3000

在浏览器中打开URL

http://127.0.0.1:3000/index.html

基本用法

迭代器

Iterator 扩展 IteratorAbstract IteratorAbstract 实现 IteratorInterface IteratorInterface 扩展 IteratorCountable

Iterator 类在内部数组中持有数据。可以使用 foreach() 命令迭代该类来从数组中检索数据。它还提供了以下方法来循环和计数数据: isFirst()isLast()current()next()hasNext()previous()hasPrevious()first()last()rewind()key()indexOf()hasIndex()setItemPosition()count()。该类实现了PHP的 IteratorCountable 接口。

CollectionArrayList 相比,Iterator 只能检索数据,不能添加数据。它也没有对其索引的控制。

$array = array();
$array[] = 'foo';
$array[] = 'bar';

// create instance
use Naucon\Utility\Iterator;
$iteratorObject = new Iterator($array);

// count
echo count($iteratorObject); // output: 2

// iterate
foreach ($iteratorObject as $key => $value) {
    echo $value . ' ';
}
// output: foo bar

迭代器感知

IteratorAware 扩展 IteratorAwareAbstract IteratorAwareAbstract 实现 IteratorAwareInterface IteratorAwareInterface 扩展 IteratorAggregateCountable

IteratorAware 类与 Iterator 类类似。它不是数组,而是在内部 Iterator 实例中持有数据。没有循环数据的方法,可以使用 foreach() 命令迭代该类。要计数数据,它提供了 count() 方法。可以通过 getIterator() 方法访问内部 Iterator。该类实现了 IteratorAggregateCountable 接口。

// create instance
use Naucon\Utility\IteratorAware;
use Naucon\Utility\Iterator;
$iteratorAwareObject = new IteratorAware(new Iterator(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)));

// count
echo count($iteratorAwareObject); // output: 10

// iterate
foreach ($iteratorAwareObject as $key => $value) {
    echo $value . '';
}
// output: 1 2 3 4 5 6 7 8 9 10

迭代器反转

IteratorReverse 扩展 IteratorReverseAbstract IteratorReverseAbstract 扩展 IteratorAbstract IteratorAbstract 实现 IteratorInterface IteratorInterface 扩展 IteratorCountable

基于 IteratorIteratorReverse 类反转返回项的顺序。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// create instance
use Naucon\Utility\IteratorReverse;
$iteratorObject = new IteratorReverse($array);

// count
echo count($iteratorObject); // Output: 10

// iterate
foreach ($iteratorObject as $key => $value) {
    echo $value . ' ';
}
// Output: 10 9 8 7 6 5 4 3 2 1

迭代器限制

IteratorLimit 扩展 IteratorLimitAbstract IteratorLimitAbstract 扩展 IteratorAbstract 实现 IteratorLimitInterface IteratorAbstract 实现 IteratorInterface IteratorInterface 扩展 IteratorCountable

基于 IteratorIteratorLimit 类通过给定的 offsetcount 参数检索数据的子集。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21);

// create instance
use Naucon\Utility\IteratorLimit;
$iteratorObject = new IteratorLimit($array, 10, 10); // offset=10, count=10

// count
echo count($iteratorObject); // Output: 21

// iterate
foreach ($iteratorObject as $key => $value) {
    echo $value . ' ';
}
// Output: 11 12 13 14 15 16 17 18 19 20

分页器

分页器类继承自PaginatorAbstract类,而PaginatorAbstract类继承自IteratorLimitAbstract类,并实现了PaginatorInterface接口。IteratorLimitAbstract类继承自IteratorAbstract类,并实现了IteratorLimitInterface接口。IteratorAbstract类实现了IteratorInterface接口。IteratorInterface接口继承自Iterator接口,并实现了Countable接口。

基于IteratorLimit类,Paginator类通过给定的itemsPerPage参数将数据分页。它还提供了以下方法来控制页面:getCurrentPageNumber()setPage()nextPage()countPages()isFirstPage()isLastPage()hasNextPage()hasPreviousPage()getNextPageNumber()getPreviousPageNumber()

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21);

// create instance
use Naucon\Utility\Paginator;
$paginatorObject = new Paginator($array, 10);

// count
echo count($paginatorObject); // Output: 21

// iterate page 1
foreach ($paginatorObject as $key => $value) {
    echo $value . ' ';
}
// Output: 1 2 3 4 5 6 7 8 9 10

// next page
$paginatorObject->nextPage();

// iterate page 2
foreach ($paginatorObject as $key => $value) {
    echo $value . ' ';
}
// Output: 11 12 13 14 15 16 17 18 19 20

// set a certain page
$paginatorObject->setPage(3);

// iterate page 3
foreach ($paginatorObject as $key => $value) {
    echo $value . ' ';
}
// Output: 21

迭代器装饰器抽象类

IteratorDecoratorAbstract实现了IteratorInterface接口。IteratorInterface接口继承自Iterator接口,并实现了Countable接口。

IteratorDecoratorAbstract是一个抽象类。与IteratorAware类类似,它在内部持有Iterator实例的数据。与IteratorAware类不同,它实现了IteratorInterface接口的每个方法,以确保与普通Iterator的完全兼容性。

它的目的是在Iterator和个别实现之间创建一个抽象层。

例如,PaginatorIteratorLimit不能修改相同的数据或实例。因为它们是IteratorInterface接口的个别实现。而装饰器可以修改任何Iterator实例,次数不限。

正如你所猜到的,它是IteratorDecoratorReverseIteratorDecoratorLimitPaginatorDecorator类的基础。

迭代器装饰器反转

IteratorDecoratorReverse继承自IteratorDecoratorAbstract类。IteratorDecoratorAbstract实现了IteratorInterface接口。IteratorInterface接口继承自Iterator接口,并实现了Countable接口。

IteratorDecoratorReverse类是任何IteratorInterface实例的装饰器。装饰器反转返回项的顺序。它具有与IteratorLimit类相同的方法。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// create instance
use Naucon\Utility\Iterator;
use Naucon\Utility\IteratorDecoratorReverse;
$iteratorLimitObject = new IteratorDecoratorReverse(new Iterator($array));

迭代器装饰器限制

IteratorDecoratorLimit继承自IteratorDecoratorAbstract类。IteratorDecoratorAbstract实现了IteratorInterface接口。IteratorInterface接口继承自Iterator接口,并实现了Countable接口。

IteratorDecoratorLimit类是任何IteratorInterface实例的装饰器。装饰器通过给定的offsetcount参数检索数据子集。它具有与IteratorLimit类相同的方法。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21);

// create instance
use Naucon\Utility\Iterator;
use Naucon\Utility\IteratorDecoratorLimit;
$iteratorLimitObject = new IteratorDecoratorLimit(new Iterator($array), 0, 10);

分页器装饰器

PaginatorDecorator继承自IteratorDecoratorLimit类,并实现了PaginatorInterface接口。IteratorDecoratorLimit继承自IteratorDecoratorAbstract类,而IteratorDecoratorAbstract实现了IteratorInterface接口。IteratorInterface接口继承自Iterator接口,并实现了Countable接口。

PaginatorDecorator类是任何IteratorInterface实例的装饰器。装饰器通过给定的itemsPerPage参数将数据分页。它具有与Paginator类相同的方法。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21);

// create instance
use Naucon\Utility\Iterator;
use Naucon\Utility\PaginatorDecorator;
$paginatorObject = new PaginatorDecorator(new Iterator($array), 10);

集合

Collection类继承自CollectionAbstract类,而CollectionAbstract类继承自IteratorAwareAbstract类,并实现了CollectionInterface接口。IteratorAwareAbstract实现了IteratorAwareInterface接口,而IteratorAwareInterface继承自IteratorAggregate接口,并实现了Countable接口。

Collection类在内部数组中存储、添加和删除数据。它还实现了IteratorAwareInterface接口,以便通过foreach()命令迭代数据。

IteratorIteratorAware不同,Collection可以检索、添加和删除数据,但它也没有索引控制。

它提供了以下方法来添加和计数数据:add()addAll()clear()contains()isEmpty()getIterator()remove()count()toArray()。该类实现了PHP的IteratorAggregateCountable接口。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// create instance
use Naucon\Utility\Collection;
$collectionObject = new Collection($array);

// count
echo count($collectionObject); // Output: 10

// iterate
foreach ($collectionObject as $key => $value) {
    echo $value . ' ';
}
// Output: 1 2 3 4 5 6 7 8 9 10


// dump data to a array
var_dump($collectionObject->toArray());
// Output: array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }


// contains value of 10
if ($collectionObject->contains(10)) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
// Output: TRUE

// contains value of 40
if ($collectionObject->contains(40)) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
// Output: FALSE


// add data
$collectionObject->add(11);

// add array of data
$collectionObject->addAll(array(12, 13, 14, 15, 16));

// remove data
$collectionObject->remove(4);

// remove all data
$collectionObject->clear();

集合装饰器

CollectionDecorator继承自CollectionDecoratorAbstract类。CollectionDecoratorAbstract实现了CollectionInterface接口。CollectionInterface接口继承自IteratorAwareInterface接口,而IteratorAwareInterface继承自IteratorAggregate接口,并实现了Countable接口。

CollectionDecorator是一个抽象类。与IteratorDecoratorAbstract类类似,它在内部持有Collection实例的数据。它实现了CollectionInterface接口的每个方法,以确保与普通Collection的完全兼容性。

其目的是在Collection和单个实现之间创建一个抽象层。

数组列表

ArrayList扩展了ListAbstractListAbstract扩展了CollectionAbstract并实现了ListInterfaceCollectionAbstract扩展了IteratorAwareAbstract并实现了CollectionInterfaceIteratorAwareAbstract实现了IteratorAwareInterfaceIteratorAwareInterface扩展了IteratorAggregateCountable

ArrayList类在内部数组中以单独的索引持有、添加和删除数据。此外,它实现了CollectionInterface,因此也实现了IteratorAwareInterface,可以通过foreach()命令迭代数据。

Collection不同,它控制索引。

它提供了以下添加和计数数据的方法:add()addWithIndex()addAll()get()hasIndex()removeIndex()set()clear()contains()isEmpty()getIterator()remove()count()toArray()。该类实现了PHP的IteratorAggregateCountable接口。

$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// create instance
use Naucon\Utility\ArrayList;
$listObject = new ArrayList($array);

// count
echo count($listObject); // Output: 10

// iterate
foreach ($listObject as $key => $value) {
    echo $value . ' ';
}
// Output: 1 2 3 4 5 6 7 8 9 10


// dump data to a array
var_dump($listObject->toArray());
// Output: array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }


// get entry by index
echo $listObject->get(0); // Output: 1
echo $listObject->get(9); // Output: 10


// add data
$listObject->add(11);

// add array of data
$listObject->addAll(array(12, 13, 14, 15, 16));

// add data with index
$listObject->addWithIndex(16, 17);
$listObject->addWithIndex(17, 18);
$listObject->set(18, 19);
$listObject->set(10, 99);

// remove data by value
$listObject->remove(4);

// remove data by index
$listObject->removeIndex(0);

// remove all data
$listObject->clear();

映射

Map扩展了MapAbstractMapAbstract实现了MapInterfaceMapInterface扩展了Countable

Map类在内部数组中持有、添加和删除键值对数据。与IteratorCollection类不同,它不能使用foreach()命令迭代数据。

Map中的键只能使用一次。当添加具有现有键的键值对时,它将覆盖现有的键值对。这是与Set类的主要区别。

它提供了以下添加和删除键值对的方法:hasKey()hasValue()get()getAll()set()setAll()remove()clear()count()。该类实现了PHP的Countable接口。

// create instance
use Naucon\Utility\Map;
$mapObject = new Map();

// key-value pair 1
$mapKey[] = 'KeyA';
$mapValue[] = 'Value A';

// key-value pair 2
$mapKey[] = 'KeyB';
$mapValue[] = 'Value B';

// key-value pair 3
$mapKey[] = 'KeyC';
$mapValue[] = 'Value C';

// add key-value-pairs to map
$mapObject->set($mapKey[0], $mapValue[0]);
$mapObject->set($mapKey[1], $mapValue[1]);
$mapObject->set($mapKey[2], $mapValue[2]);

// get key-value-pairs from map
echo $mapObject->get($mapKey[0]); // Output: Value A
echo $mapObject->get($mapKey[1]); // Output: Value B
echo $mapObject->get($mapKey[2]); // Output: Value C

// count key-value-pairs
echo count($mapObject); // Output: 3

// remove key-value pair with 'Value B'
$mapObject->remove($mapKey[1]);

哈希映射

HashMap扩展了HashMapAbstractHashMapAbstract扩展了MapAbstract并实现了HashMapInterfaceMapAbstract实现了MapInterfaceMapInterface扩展了Countable

基于MapHashMap以与Map类相同的方式添加和删除键值对。与Map类不同,HashMap中的键也可以是对象的实例。HashMap使用spl_object_hash()函数将实例转换为哈希键。由于键被转换为哈希,HashMap不能返回其原始形式(对象)。但可以通过给定的实例添加、删除和返回值。

它提供了以下添加和删除键值对的方法:hasKey()hasValue()get()getAll()set()setAll()remove()clear()count()。该类实现了PHP的Countable接口。

树映射

TreeMap扩展了TreeMapAbstractTreeMapAbstract扩展了Map并实现了MapInterfaceMap扩展了MapAbstractMapAbstract实现了MapInterfaceMapInterface扩展了Countable

TreeMap类与Map类类似。它在内部数组中持有、添加和删除键值对数据。

Map不同,TreeMap可以向一个键添加多个值。

它提供了以下添加和删除键值对的方法:hasKey()hasValue()get()getAll()set()setAll()remove()clear()count()。该类实现了PHP的Countable接口。

// create instance
use Naucon\Utility\TreeMap;
$mapObject = new TreeMap();

// key-value pair 1
$mapKey[0] = 'KeyA';
$mapValue[0] = 'Value A';

// key-value pair 2
$mapKey[1] = 'KeyB';
$mapValue[1] = 'Value B';

// key-value pair 3
$mapKey[2] = 'KeyC';
$mapValue[2][0] = 'Value C1';
$mapValue[2][1] = 'Value C2';
$mapValue[2][2] = 'Value C3';

// add key-value pairs to map
$mapObject->set($mapKey[0], $mapValue[0]);
$mapObject->set($mapKey[1], $mapValue[1]);
$mapObject->set($mapKey[2], $mapValue[2][0]);
$mapObject->set($mapKey[2], $mapValue[2][1]);
$mapObject->set($mapKey[2], $mapValue[2][2]);

// get key-value pairs from map
echo $mapObject->get($mapKey[0]); // Output: Value A
echo $mapObject->get($mapKey[1]); // Output: Value B
foreach ($mapObject->get($mapKey[2]) as $value) {
    echo $value . ' ';
}
// Output: Value C1 Value C2 Value C3'

// count key-value-pairs
echo count($mapObject); // Output: 3

// remove key-value with 'Value B'
$mapObject->remove($mapKey[1]);

集合

Set扩展了SetAbstractSetAbstract扩展了CollectionAbstractCollectionAbstract扩展了IteratorAwareAbstract并实现了CollectionInterfaceIteratorAwareAbstract实现了IteratorAwareInterface

Set类与Collection类类似。它在内部数组中持有、添加和删除数据。现有值只能添加一次。数据也可以通过foreach()命令进行迭代。

它提供了以下检索、添加和删除数据的方法:add()addAll()clear()contains()isEmpty()getIterator()remove()count()toArray()。该类实现了PHP的IteratorAggregateCountable接口。

// create instance
use Naucon\Utility\Set;
$setObject = new Set();
$setObject->addAll(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

// count
echo count($setObject); // Output: 10

// iterate
foreach ($setObject as $key => $value) {
    echo $value . ' ';
}
// Output: 1 2 3 4 5 6 7 8 9 10


// dump data to a array
var_dump($setObject->toArray());
// Output: array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }


// contains value of 10
if ($setObject->contains(10)) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
// Output: TRUE

// contains value of 40
if ($setObject->contains(40)) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}
// Output: FALSE


// add data
$setObject->add(11);    // return true

// add array of data
$setObject->addAll(array(12, 13, 14, 15, 16));

// add duplicate data   // return false
$setObject->add(11);

// remove data
$setObject->remove(4);

// remove all data
$setObject->clear();

哈希集合

HashSet扩展了HashSetAbstractHashSetAbstract扩展了SetAbstract并实现了HashSetInterfaceSetAbstract扩展了CollectionAbstractCollectionAbstract扩展了IteratorAwareAbstract并实现了CollectionInterfaceIteratorAwareAbstract实现了IteratorAwareInterface

基于Set所持有的,HashSet以与Set类相同的方式添加和删除数据。与Set类相比,HashSet中的键是其值的哈希。使用spl_object_hash()函数将给定值的实例转换为哈希键。

Set类一样,现有值只能添加一次。还可以通过foreach()命令迭代数据。

它提供了以下方法来添加和删除键值对:add()addAll()clear()contains()isEmpty()getIterator()remove()count()toArray()。该类实现了PHP的IteratorAggregateCountable接口。

Tree扩展自TreeAbstractTreeAbstract扩展自TreeNodeAbstract,并实现了TreeInterface接口。TreeNodeAbstract实现了TreeNodeInterface接口。TreeInterface扩展自TreeNodeInterfaceIteratorAwareInterface接口,而IteratorAwareInterface扩展自IteratorAggregateCountable

Tree类在内部使用HashSet存储层次结构数据。可以使用foreach()命令迭代该类以检索HashSet中的数据。它还提供了以下方法来检索、添加和删除数据:getIterator()hasChilds()count()add()addChild()removeChild()hasParent()getParent()removeNode()rewind()key()indexOf()hasIndex()setItemPosition()count()。该类实现了PHP的IteratorAggregateCountable接口。

IteratorAwareIteratorCollection不同,Tree只与TreeNodeInterface的实例一起工作。

// create instance
use Naucon\Utility\TreeNodeAbstract;
use Naucon\Utility\TreeInterface;
use Naucon\Utility\TreeAbstract;
use Naucon\Utility\Tree;
$treeRootObject = new Tree();

// declare a simple tree node class
class FooTree extends TreeNodeAbstract
{
    protected $value = '';

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }
}

// declare another simple tree node class
class BarTree extends TreeAbstract
{
    protected $value = '';

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }
}

// create instance of tree nodes
$fooObj1 = new \FooTree('A');
$fooObj2 = new \FooTree('B');

// add a nodes A and B to tree
$treeRootObject->add($fooObj1);
$treeRootObject->add($fooObj2);

// add a tree C to tree
$treeChildLevel1Object = $treeRootObject->add(new \BarTree('C')); // add() returns a instance of the `TreeNode`

// add a node C1 to node C
$treeChildLevel1Object->add(new \FooTree('C1'));

// add a node C2 to node C
$treeChildLevel2Object = $treeChildLevel1Object->add(new \BarTree('C2'));

// add a node C21 to node C2
$treeChildLevel2Object->add(new \FooTree('C21'));

// add a node C3 to node C
$treeChildLevel1Object->add(new \FooTree('C3'));

// add a node D to tree
$treeRootObject->add(new \FooTree('D'));


// count
echo count($treeRootObject); // Output: 4


// iterate
foreach ($treeRootObject as $treeNodeObject) {
    echo $treeNodeObject->getValue();
    echo '<br/>';

    if ($treeNodeObject instanceof TreeInterface) {
        foreach ($treeNodeObject as $treeChildNodeObject) {
            echo $treeNodeObject->getValue() . ' - ' . $treeChildNodeObject->getValue();
            echo '<br/>';

            if ($treeChildNodeObject instanceof TreeInterface) {
                foreach ($treeChildNodeObject as $treeChild2NodeObject) {
                    echo $treeNodeObject->getValue() . ' - ' . $treeChildNodeObject->getValue() . ' - ' . $treeChild2NodeObject->getValue();
                    echo '<br/>';
                }
            }
        }
    }
}
// Output:
// A
// B
// C
// C - C1
// C - C2
// C - C2 - C21
// C - C3
// D


// remove tree node from tree
$treeRootObject->remove($fooObj2);

枚举器

Enumerator扩展自EnumeratorAbstractEnumeratorAbstract扩展自IteratorAbstract,并实现了EnumeratorInterface接口。IteratorAbstract实现了IteratorInterface接口,而IteratorInterface扩展自IteratorCountable

Enumerator类提供了一种简单的方法来检索、添加和迭代数据的键值对。可以使用foreach()命令迭代该类。它还提供了以下方法来检索、添加和删除数据的键值对:set()remove()isFirst()isLast()current()next()hasNext()previous()hasPrevious()first()last()key()valid()rewind()hasIndex()indexOf()setItemPosition()count()。该类实现了IteratorCountable接口。

// create instance
use Naucon\Utility\Enumerator;
$enumeratorObject1 = new Enumerator('RED', 'BLUE', 'GREEN', 'YELLOW', 'BLACK');

echo 'My favorite color is ' . $enumeratorObject1->RED;
// Output: My favorite color is RED

// iterate
foreach ($enumeratorObject1 as $key => $value) {
    echo $value . ' ';
}
// Output: RED BLUE GREEN YELLOW BLACK


// create another instance
$enumeratorObject2 = new Enumerator();

// add enumeration
$enumeratorObject2->set('FF0000', 'RED');
$enumeratorObject2->set('0000FF', 'BLUE');
$enumeratorObject2->set('00FF00', 'GREEN');
$enumeratorObject2->set('FFFF00', 'YELLOW');
$enumeratorObject2->set('000000', 'BLACK');

echo 'HEX color code of RED is #' . $enumeratorObject2->RED;
// Output: HEX color code of RED is #FF0000


// create another instance
$enumeratorObject3 = new Enumerator();

// add enumeration
$enumeratorObject3->RED = 'FF0000';
$enumeratorObject3->BLUE = '0000FF';
$enumeratorObject3->GREEN = '00FF00';
$enumeratorObject3->YELLOW = 'FFFF00';
$enumeratorObject3->BLACK = '000000';

echo 'HEX color code of RED is #' . $enumeratorObject3->RED;
// Output: HEX color code of RED is #FF0000


// create another instance
$enumeratorObjectParent = new Enumerator();

// add enumeration
$enumeratorObjectParent->COLOR = $enumeratorObject3;    // add a enumeration instance
$enumeratorObjectParent->FOO = 'bar';

echo 'HEX color code of RED is #' . $enumeratorObjectParent->COLOR->RED . '<br/>';
// Output: HEX color code of RED is #FF0000

// iterate
foreach ($enumeratorObjectParent as $key => $value) {
    if ($value instanceof Enumerator) {
        echo $key . ' ';
        foreach ($value as $value2) {
            echo $value2 . ' ';
        }
    } else {
        echo (string)$value . ' ';
    }
}
// Output: COLOR FF0000 0000FF 00FF00 FFFF00 000000 bar

组合

Composite扩展自CompositeAbstractCompositeAbstract扩展自IteratorAbstract,并实现了CompositeElementInterface接口。IteratorAbstract实现了IteratorInterface接口,而IteratorInterface扩展自IteratorCountable

Composite类在内部使用数组存储层次结构数据,类似于Tree类。可以使用foreach()命令迭代该类以检索子元素。它还提供了以下方法来检索、添加和删除数据:add()remove()isFirst()isLast()current()next()hasNext()previous()hasPrevious()first()last()key()valid()rewind()indexOf()setItemPosition()count()。该类实现了PHP的IteratorCountable接口。

Tree类不同,组合没有根元素。每个元素都是相等的。

元素必须是CompositeElementInterface的实例。

use Naucon\Utility\CompositeAbstract;

// declare simple composite element class
class CompositeElement extends CompositeAbstract
{
    protected $state = null;

    public function __construct($state)
    {
        $this->state = $state;
    }

    public function __toString()
    {
        return $this->state;
    }
}

// create element instances
$elementAObject = new \CompositeElement('A');
$elementBObject = new \CompositeElement('B');
$elementCObject = new \CompositeElement('C');
$elementDObject = new \CompositeElement('D');
$elementEObject = new \CompositeElement('E');

// add elements
$elementAObject->add($elementBObject); // B to A
$elementAObject->add($elementCObject); // C to A
$elementBObject->add($elementDObject); // D to B
$elementAObject->add($elementEObject); // E to A

// iterate
foreach ($elementAObject as $elementChildObject) {
    echo (string)$elementChildObject . ' '; // call __toString() method
}
// Output: B C E

// remove element
//$elementAObject->remove($elementBObject);

许可证

MIT许可证(MIT)

版权所有(c)2015 Sven Sanzenbacher

在此特此授予任何获得此软件和相关文档副本(“软件”)的人免费使用该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许获得该软件的人这样做,但受以下条件的约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论这些责任是否源于合同行为、侵权行为或其他,无论是否与软件有关、使用软件或其他与软件有关的行为。