Skip to content

Commit

Permalink
up
Browse files Browse the repository at this point in the history
  • Loading branch information
Vasiliy-Makogon committed Oct 4, 2023
1 parent b3bd34e commit f9d74e6
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 91 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/.idea
/composer.lock
/vendor
/.phpunit.cache
/.phpunit.cache
/html-coverage
88 changes: 34 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Объектный массив на PHP

`\Krugozor\Cover\CoverArray` - это базовый класс для удобной и гибкой работы с массивами в объектно-ориентированном
`CoverArray` - базовый класс для удобной и гибкой работы с массивами в объектно-ориентированном
представлении. Фактически, это "объектный массив", которого так не хватает в PHP.

## Как это работает?
Expand All @@ -13,6 +13,18 @@ class NewTypeArray extends CoverArray
{}
```

Примечание: в данном примере, как и в тестах, используется тип данных `NewTypeArray`,
наследуемый от `CoverArray`. Это сделано для того, что бы продемонстрировать гибкость данного решения.
Объектов, производных от `CoverArray`, в программе может быть много, они могут отличаться на концептуальном уровне.
Например, объекты класса `CoverArray` можно использовать просто как "объектный массив"
для замещения стандартного `array` в повседневной работе,
в свою очередь любой другой тип, производный от `CoverArray`, может служить, например, неким подобием DTO
или попросту быть независимым типом данных для предотвращения "выстрела в ногу":

```php
function foo(NewTypeArray $data) {}
```

Инстанцируем новый объект данного класса. Передадим в конструктор многомерный массив и посмотрим на структуру, которая
получится:

Expand All @@ -22,14 +34,14 @@ $data = new NewTypeArray([
'lastName' => 'Ivanov',
'langs' => [
'backend' => ['PHP', 'MySql'],
'frontend' => ['HTML', 'CSS 1', 'JavaScript', 'CSS 2', 'CSS3']
'frontend' => ['HTML', 'CSS1', 'JavaScript', 'CSS2', 'CSS3']
],
]);

var_dump($data);
```

Результат отладки:
Результат:

```
object(Krugozor\Cover\Tests\NewTypeArray)#4 (1) {
Expand Down Expand Up @@ -60,11 +72,11 @@ object(Krugozor\Cover\Tests\NewTypeArray)#4 (1) {
[0]=>
string(4) "HTML"
[1]=>
string(5) "CSS 1"
string(5) "CSS1"
[2]=>
string(10) "JavaScript"
[3]=>
string(5) "CSS 2"
string(5) "CSS2"
[4]=>
string(4) "CSS3"
}
Expand All @@ -75,15 +87,10 @@ object(Krugozor\Cover\Tests\NewTypeArray)#4 (1) {
}
```

Как видно, произошло два крайне важных события:

1. Все переданные в конструктор массивы многомерного массива преобразовались в объекты текущего
класса (в данном случае `NewTypeArray`).
Это поведение гарантирует, что любой массив, попадающий в объект наследуемый от `CoverArray`,
становится объектным массивом.

2. Данные всех созданных объектов аккуратно сложились в protected-свойства `$data`, что обеспечивает инкапсуляцию данных
и возможность реализации любых методов над ними.
Как видно, все переданные в конструктор массивы рекурсивно преобразовались в объекты типа `NewTypeArray`.
Это поведение гарантирует, что любой массив, попадающий в хранилище, получит "обложку" (cover) в виде типа текущего класса.
Данные всех созданных объектов аккуратно сложились в protected-свойства `$data`, что обеспечивает инкапсуляцию данных
и возможность реализации любых методов над ними.

## Давайте попробуем поработать с данными созданного выше объекта:

Expand All @@ -100,7 +107,7 @@ var_dump($value);
```
Результат:
```
string(18) "CSS 1, CSS 2, CSS3"
string(18) "CSS1, CSS2, CSS3"
```

Пример:
Expand All @@ -118,11 +125,11 @@ array(7) {
[0]=>
string(4) "HTML"
[1]=>
string(5) "CSS 1"
string(5) "CSS1"
[2]=>
string(10) "JavaScript"
[3]=>
string(5) "CSS 2"
string(5) "CSS2"
[4]=>
string(4) "CSS3"
[5]=>
Expand Down Expand Up @@ -175,45 +182,18 @@ string(75) "O:33:"Krugozor\Cover\Tests\NewTypeArray":2:{i:0;s:3:"PHP";i:1;s:5:"M

Пример:
```php
foreach ($data->get('langs') as $stack => $values) {
echo sprintf(
"<ul>%s (%s): %s</ul>\n",
$stack,
$values->count(),
$values->map(fn(string $value): string => "<li>$value</li>")->implode('')
);
}
```
Результат:
```
```


Пример:
```php
```
Результат:
```
```


Пример:
```php
```
Результат:
```
```


Пример:
```php
```
Результат:
```
```


Пример:
```php
```
Результат:
```
<ul>backend (2): <li>PHP</li><li>MySql</li></ul>
<ul>frontend (5): <li>HTML</li><li>CSS1</li><li>JavaScript</li><li>CSS2</li><li>CSS3</li></ul>
```

16 changes: 10 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
{
"name":"krugozor/cover",
"description": "Попытка реализации объектного массива",
"description": "PHP Array Object",
"type":"library",
"keywords": [
"array",
"object",
"cover array",
"php array cover",
"array object",
"php array object",
"ArrayObject",
"php array object"
"array wrapper",
"php array wrapper",
"php collection",
"php array"
],
"require":{
"php": ">=8.0"
Expand All @@ -16,8 +21,7 @@
},
"authors": [
{
"name": "Vasiliy Makogon",
"email": "makogon-vs@yandex.ru"
"name": "Vasiliy Makogon"
}
],
"autoload" : {
Expand Down
12 changes: 11 additions & 1 deletion phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
displayDetailsOnTestsThatTriggerErrors="true"
displayDetailsOnTestsThatTriggerNotices="true"
displayDetailsOnTestsThatTriggerWarnings="true"
colors="true"
>
<testsuites>
<testsuite name="default">
Expand All @@ -24,7 +25,16 @@

<source restrictDeprecations="false" restrictNotices="false" restrictWarnings="false">
<include>
<directory>src</directory>
<directory suffix=".php">src</directory>
</include>
</source>

<coverage includeUncoveredFiles="false"
pathCoverage="false"
ignoreDeprecatedCodeUnits="false"
disableCodeCoverageIgnore="false">
<report>
<html outputDirectory="html-coverage" lowUpperBound="50" highLowerBound="90" />
</report>
</coverage>
</phpunit>
Loading

0 comments on commit f9d74e6

Please sign in to comment.