PHPackages                             venne/generics - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. venne/generics

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

venne/generics
==============

Generics in PHP

28PHP

Since Mar 11Pushed 12y ago2 watchersCompare

[ Source](https://github.com/Venne/generics)[ Packagist](https://packagist.org/packages/venne/generics)[ RSS](/packages/venne-generics/feed)WikiDiscussions master Synced 3w ago

READMEChangelogDependenciesVersions (1)Used By (0)

\[EXPERIMENT\] Venne\\Generics
==============================

[](#experiment-vennegenerics)

Usage
-----

[](#usage)

**Basic usage**

Use phpDoc `@template` as definition of template types:

```
/**
 * @template IEntity
 */
class Repository {

	public function save(IEntity $entity)
	{
		...
	}

}
```

Now you can generate own class generated from template. Symbol `_` is default separator between class name and template type.

```
class Article {}

$articleRepository = new Repository_Article;
$articleRepository->save(new Article); // works
$articleRepository->save(11); // fail
```

If you need to use multiple template types, define them in phpDoc:

```
/**
 * @template IEntity, IEntityManager
 */
...
```

and work with it similarly:

```
$articleRepository = new Repository_Article_EntityManager;
...
```

If you want to remove typehint:

```
$repository = new Repository_;
$repository->save('yeah'); // works
$repository->save(33); // works
$repository->save(new stdClass()); // works
...
```

**Working with namespaces**

Use absolute class names:

```
$article = new App\Article;
$article->text = 'Foo';

$articleRepository = new App\Repository_App\Article;
$articleRepository->save($article);
```

Or you can use `use statements`:

```
use App\Article;
use App\Repository_App\Article as ArticleRepository;

$article = new Article;
$article->text = 'Foo';

$articleRepository = new ArticleRepository;
$articleRepository->save($article);
```

**Autowiring**

```
services:
	- ArticleRepository_Article
	- ArticleService
```

```
use ArticleRepository_Article as ArticleRepository;

class ArticleService {

	private $repository;

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

}
```

**Inheritance rules**

```
abstract class Entity {}
class Page extends Entity {}
class Article extends Page {}
abstract class Repository {}

/** @template Page */
class PageRepository extends Repository {
	public function(Page $entity) {}
}

$pageRepository = new PageRepository;
$articleRepository = new PageRepository_Article;

echo $pageRepository instanceof Repository; // TRUE
echo $pageRepository instanceof PageRepository; // TRUE

echo $articleRepository instanceof Repository; // TRUE
echo $articleRepository instanceof PageRepository; // FALSE
```

Installation
------------

[](#installation)

```
composer require venne/generics
```

Configuration in Nette framework
--------------------------------

[](#configuration-in-nette-framework)

```
extensions:
	generics: Venne\Generics\DI\GenericsExtension
```

```
generics:
	separator: '_'
```

Manual configuration
--------------------

[](#manual-configuration)

```
$generics = new Venne\Generics\Generics;
$loader = new Venne\Generics\Loader($generics);
$loader->register();
```

###  Health Score

21

—

LowBetter than 18% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/a173564fd150b9e9c8307ba7de2cf5588d0bcee71553f35d8946ff3abc4ce21e?d=identicon)[pepakriz](/maintainers/pepakriz)

---

Top Contributors

[![pepakriz](https://avatars.githubusercontent.com/u/383294?v=4)](https://github.com/pepakriz "pepakriz (1 commits)")

### Embed Badge

![Health badge](/badges/venne-generics/health.svg)

```
[![Health](https://phpackages.com/badges/venne-generics/health.svg)](https://phpackages.com/packages/venne-generics)
```

###  Alternatives

[beyondcode/laravel-masked-db-dump

Dump masked information from your database

11348.3k](/packages/beyondcode-laravel-masked-db-dump)[mervick/aaencoder

Encode/decode any JavaScript program to/from Japanese style emoticons

411.6k](/packages/mervick-aaencoder)[appolodev/bolt-seo

Bolt - Seo extension

1216.6k](/packages/appolodev-bolt-seo)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
