Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/edmondscommerce/php-generic
Generator for generic array/vector.
https://github.com/edmondscommerce/php-generic
Last synced: about 2 months ago
JSON representation
Generator for generic array/vector.
- Host: GitHub
- URL: https://github.com/edmondscommerce/php-generic
- Owner: edmondscommerce
- License: mit
- Fork: true (d0niek/php-generic)
- Created: 2019-02-16T11:04:06.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2019-06-14T13:07:02.000Z (over 5 years ago)
- Last Synced: 2024-09-24T22:49:22.666Z (about 2 months ago)
- Language: PHP
- Homepage:
- Size: 142 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# This is a Fork
Please see original: https://github.com/d0niek/php-generic
This is now becoming more of a pure wrapper for php-ds to allow generating of typed implementations of the php-ds data structures.
Currently there is only Vector, though more might be added as we need them
## PHPStan
Currently seeing some issues with PHPStan, suggest the following ignore errors:
```
parameters:
ignoreErrors:
- '#unknown class.+?HumbugBox.+?Vector#'
- '#Vector.+?offset.+?\(\) should be contravariant#'
- '#Cannot .+? offset int .+? Ds\\Vector#'
```-------
Original README
# Prepare for future with php-generic
According to this [article](https://www.sitepoint.com/creating-strictly-typed-arrays-collections-php/)
which shows how to create strictly typed arrays and collections in Php7, php-generic generator was born.---
There is some [discusion](https://wiki.php.net/rfc/generic-arrays) about generic in Php
but who knows when it comes to us.It is not exacly what you know from Java or C++ where generic looks like
`Vector()`, `Array()` or `Vector<\Namespace\Entity\User>()`.Here generics looks like `VectorInt`, `ArrayBool` and `VectorUser`
so I hope when they come to nativ Php all what you need to do will be:
1. Replace all `VectorType`, `ArrayType` to `Vector`, `array`,
2. Delete directory where you store all generated array/vector,
3. Enjoy a nice day.## What generics are (not)
They are not collections like Doctrine or Laravel Collections. They are like normal php array
which can store values one type. `array` can store only numeric values which will converted to `int`
so you can not push `'some string value'` to it.## Install
```bash
$ composer require d0niek/php-generic
```## Generate generic `array`
There is a bin command that you should find in **vendor/bin**
or somewhere else according to your **composer.json** settings.To generate a generic array run:
```bash
$ bin/generic generate:array [-s|--save [SAVE]] [--]
```
where:
* **-s**|**--saveCollection** - do you want to save generated array for future regenerate (default **true**),
* **type** - is a type of generic array. It can be simple type (bool, int, float, string, array)
or complex type (\\YourApp\\Module\\Repository\\User),
* **namespace** - is a namespace where new generic array will be save.
Remember that namespace's directory have to exists.
To separate namespace parts use **\\\\** or **/** to speed up typing
if your namespace is 1:1 with your directory structureFor example you have project in **/path/to/project** and your **composer.json** contains this kind of entry:
```json
"autoload": {
"psr-4": {
"VendorName\\AppName\\": "src/"
}
}
```
Now, when you call command like this:
```bash
$ bin/generic generate:array int VendorName\\AppName\\Collections
```
new generic array `ArrayInt` will be save to **/path/to/project/src/Collections/** directory.
If this directory does not exists, exceptions will be throw.
> Tip! Store all php-generics in one diretory and add it to **.gitignore**.
When php will start support generics, replace `ArrayInt` to `array` and remove php-generic directory.## Generate generic `Vector`
You can alse generate generic [\\Ds\\Vector](http://php.net/manual/en/class.ds-vector.php)
(it is new data structure since Php7,
[here](https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd)
you can and you should read about it!). To do this just run:
```bash
$ bin/generic generate:vector [-s|--save [SAVE]] [--]
```
parameters means exacly the same whats means when you run `generate:array`.## Regenerate
By defaule generated array/vector are save in **generated-colletions.json** file in your root app path.
Keep this file in repository and ignore all generated php-generics. When you clone repository,
after `composer install` run:
```bash
$ bin/generic collections:regenerate
```
and all your collections will be regenerate.## Select data from DB
Now you can create in easy way specific generic when you are selecting data from DB
```php
class UserRepository implements UserRepositoryInterface
{
.../**
* @inheritDoc
*/
public function findAll(): VectorUser
{
$users = new VectorUser();
$mysqli = new \mysqli('localhost:3306', 'user', 'password', 'db');$mysqliResult = $mysqli->query('SELECT id, name FROM users LIMIT 10');
if ($mysqliResult !== false) {
while (($user = $mysqliResult->fetch_object(User::class)) !== null) {
$users->push($user);
}
}$mysqli->close();
return $users;
}...
}
```## Test
Before you run tests remember to regenerate collections. Run:
```bash
$ bin/generic collections:regenerate
```
and now you can run
```bash
$ phpunit
```