venne / generics
此包最新版本(dev-master)无可用许可证信息。
PHP 中的泛型
dev-master
2014-03-11 09:56 UTC
Requires
- php: >=5.3.1
- nette/nette: ~2.0
Requires (Dev)
- nette/tester: ~1.0.0
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();