2017 © Pedro Peláez
 

library generics

Generics in PHP

image

venne/generics

Generics in PHP

  • Tuesday, March 11, 2014
  • by pepakriz
  • Repository
  • 3 Watchers
  • 2 Stars
  • 2 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

[EXPERIMENT] Venne\Generics

Usage

Basic usage, (*1)

Use phpDoc @template as definition of template types:, (*2)

/**
 * @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., (*3)

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:, (*4)

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

and work with it similarly:, (*5)

$articleRepository = new Repository_Article_EntityManager;
...

If you want to remove typehint:, (*6)

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

Working with namespaces, (*7)

Use absolute class names:, (*8)

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

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

Or you can use use statements:, (*9)

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

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

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

Autowiring, (*10)

services:
    - ArticleRepository_Article
    - ArticleService
use ArticleRepository_Article as ArticleRepository;

class ArticleService {

    private $repository;

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

}

Inheritance rules, (*11)

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

composer require venne/generics

Configuration in Nette framework

extensions:
    generics: Venne\Generics\DI\GenericsExtension
generics:
    separator: '_'

Manual configuration

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

The Versions

11/03 2014

dev-master

9999999-dev

Generics in PHP

  Sources   Download

The Requires

 

The Development Requires