larzone/hinnyuu

此包最新版本(v2.3.0)没有可用的许可信息。

依赖管理器

v2.3.0 2016-07-14 14:14 UTC

This package is auto-updated.

Last update: 2024-08-29 04:03:29 UTC


README

Hinnyuu 使用反射来构建依赖项并在类上调用方法。它缓存所有实例化的对象,并且只实例化一次。正如其名所示,它是一个非常小的实用库。为了方便起见,可以使用 hinnyuu() 函数作为访问类的公共接口。Hinnyuu 类的实例作为函数内的静态变量存在。

基本用法

这将使用反射找到的用户名和密码(通过构造函数参数)实例化具体的数据库实现。

<?php
namespace MyApp\Implementations {
    interface IDatabase { public function query($str); }
    class Database implements IDatabase { public function __construct($username, $password) {} public function query($str) { echo($str); } }
}
namespace MyApp {
    use MyApp\Implementations\IDatabase;
    use MyApp\Implementations\Database;
    use function Dekapai\Hinnyuu\Facade\hinnyuu;
    // register
    hinnyuu([IDatabase::class => Database::class]);
    // invoke a closure
    hinnyuu(function(IDatabase $db) { return $db->query("SELECT * FROM users"); }, ['username' => 'bill.gates', 'password' => 'susageP']);
}

静态方法

对于工厂和/或单例类,传递一个数组 ['ClassName', 'methodName'] 而不是字符串 ClassName。

<?php
// register interface to a concrete implementation
hinnyuu(['MyApp\Interfaces\IDatabase' => ['MyApp\Implementations\Database', 'makeInstance']]);

// invocation of MyMethod on class MyController (automatically resolves all dependencies)
$result = hinnyuu('MyController', 'MyMethod');

事件系统

使用两个函数实现了一个简约的事件系统:attach(event, listener) 和 trigger(event)。当使用 trigger 函数触发由事件字符串标识的事件时,会运行监听器类的构造函数。事件字符串不必指向一个类。监听器可以是类或闭包。两种情况下都完成了依赖注入。

<?php

attach(Event1::class, Listener1::class);
attach(Event1::class, Listener2::class);
trigger(Event1::class);

attach('some_event', function() { print "event happened"; });
attach('some_event', function(SomeDependency $d) { error_log(sprintf("[%d]log something maybe"), $d->getCode(); });
trigger('some_event');