venne/generics

此包最新版本(dev-master)无可用许可证信息。

PHP 中的泛型

dev-master 2014-03-11 09:56 UTC

This package is auto-updated.

Last update: 2024-08-29 04:19:48 UTC


README

用法

基本用法

使用 phpDoc @template 作为模板类型的定义

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

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

}

现在您可以生成由模板生成的类。符号 _ 是类名和模板类型之间的默认分隔符。

class Article {}

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

如果您需要使用多个模板类型,请在 phpDoc 中定义它们

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

并以类似的方式与之交互

$articleRepository = new Repository_Article_EntityManager;
...

如果您想移除类型提示

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

使用命名空间

使用绝对类名

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

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

或者您可以使用 use 语句

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

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

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

自动装配

services:
	- ArticleRepository_Article
	- ArticleService
use ArticleRepository_Article as ArticleRepository;

class ArticleService {

	private $repository;

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

}

继承规则

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

Nette 框架中的配置

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

手动配置

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