dev-master
9999999-devGenerics in PHP
The Requires
- nette/nette ~2.0
- php >=5.3.1
The Development Requires
Wallogit.com
2017 © Pedro Peláez
Generics in PHP
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
composer require venne/generics
extensions:
generics: Venne\Generics\DI\GenericsExtension
generics:
separator: '_'
$generics = new Venne\Generics\Generics; $loader = new Venne\Generics\Loader($generics); $loader->register();
Generics in PHP