PHPackages                             cwm/hypo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. cwm/hypo

ActiveLibrary[Framework](/categories/framework)

cwm/hypo
========

Dependency Injection Container for PHP

1.3.0(11y ago)026MITPHPPHP &gt;=5.4.0

Since Jul 28Pushed 11y ago1 watchersCompare

[ Source](https://github.com/cwmiller/hypo)[ Packagist](https://packagist.org/packages/cwm/hypo)[ RSS](/packages/cwm-hypo/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (1)Versions (8)Used By (0)

Hypo
====

[](#hypo)

Hypo is a Dependency Injection Container for PHP 5.4+. It provides a simple, fluent API for configuration. Currently, Hypo only supports Constructor Injection.

Installation
------------

[](#installation)

Hypo can easily be added to your project via [Composer](http://getcomposer.org/):

```
"require": {
    "cwm/hypo": "1.2.2"
},
```

Examples
--------

[](#examples)

### Registering a Class

[](#registering-a-class)

```
class Crypt {
    public function crypt($password) {
        return md5($password);
    }
}

$container = new Container();
$container->register('Crypt');

$crypt = $container->resolve('Crypt');
echo $crypt->crypt('testing');
```

### Registering a Class for an Interface

[](#registering-a-class-for-an-interface)

```
interface ICrypt {
    public function crypt($password);
}

class Crypt implements ICrypt {
    public function crypt($password) {
        return md5($password);
    }
}

$container = new Container();
$container
    ->register('Crypt')
    ->with('ICrypt');

$crypt = $container->resolve('ICrypt');
```

### Registering a Class for Multiple Interfaces

[](#registering-a-class-for-multiple-interfaces)

```
interface ICrypt {
    public function crypt($password);
}

interface IPasswordResetter {
    public function reset($user, $password);
}

class Crypt implements ICrypt, IPasswordResetter {
    public function crypt($password) {
        return md5($password);
    }

    public function reset($user, $password) {
        $user->setPassword($this->crypt($password));
    }
}

$container = new Container();
$container
    ->register('Crypt')
    ->with(array('ICrypt', 'IPasswordResetter'));
```

### Registering a Class for All Implemented Interfaces

[](#registering-a-class-for-all-implemented-interfaces)

```
interface ICrypt {
    public function crypt($password);
}

interface IPasswordResetter {
    public function reset($user, $password);
}

class Crypt implements ICrypt, IPasswordResetter {
    public function crypt($password) {
        return md5($password);
    }

    public function reset(User $user, $password) {
        $user->setPassword($this->crypt($password));
    }
}

$container = new Container();
$container
    ->register('Crypt')
    ->withImplementedInterfaces();
```

### Registering Instances

[](#registering-instances)

Previously instantiated objects can be registered with the `registerInstance()` method. By default, they will be resolved for requests of the class the object instantiated.

```
$container = new Container();
$container
    ->register($instanceOfCrypt)
    ->withImplementedInterfaces();
```

### Configuring Constructor Arguments

[](#configuring-constructor-arguments)

Type hinted arguments are automatically resolved if they are classes or interfaces. This can be overridden by using the NamedDependency feature (see next section). Primitive arguments on the other hand have to be specified if they do not have a default value.

```
interface ICrypt {
    public function crypt($password);
}

class BCrypt implements ICrypt {
    public function __construct($workfactor) {
        ...
    }
}

$container = new Container();
$container
    ->register('BCrypt')
    ->with('ICrypt')
    ->withParameters(array(
        'workfactor' => 10
    ));
```

### Custom Construction via Closure

[](#custom-construction-via-closure)

If the container is not suitable for handling the construction of an object, then it can be customized by use of the `constructedBy()` method on the fluent API. The closure is passed the name of the class and expects an instance of it to be returned.

```
$container = new Container();
$container
    ->register('Crypt')
    ->with('ICrypt')
    ->constructedBy(function($className) {
        return new $className(rand());
    });
```

### Naming Registrations

[](#naming-registrations)

When multiple classes are registered for the same implementation, they can each be given a unique name. This name can be used to resolve the class by using the `resolveName()` method.

```
interface ICrypt {
    public function crypt($password);
}

class BCrypt implements ICrypt {
    public function __construct($workfactor) {
        ...
    }
}

class MD5Crypt implements ICrypt {
    ...
}

$container = new Container();
$container
    ->register('BCrypt')
    ->with('ICrypt')
    ->withParameters(array(
        'workfactor' => 10
    ))
    ->withName('bcrypt');

$container->resolveName('bcrypt');
```

Also, the name can be used with the `NamedDependency` class when configuring parameters:

```
class UserService {
    public function __construct(ICrypt $crypt) {
        ...
    }
}

$container
    ->register('UserService')
    ->withParameters(array(
        'crypt' => new NamedDependency('bcrypt')
    ));
```

### Configuring Object Lifespan

[](#configuring-object-lifespan)

Singletons can be set by using the `asSingleton()` method. `asTransient()` is also provided, but it is not required to specify because all registrations are transient by default.

```
interface IUserRepo {
    ...
}

class UserRepo implements IUserRepo {
    ...
}

$container = new Container();
$container
    ->register('UserRepo')
    ->with('IUserRepo')
    ->asSingleton();
```

License
-------

[](#license)

Copyright (c) 2013 Chase Miller

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~122 days

Recently: every ~152 days

Total

6

Last Release

4054d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0bb7160a4f18c8d1d38f59f667031a7041225098c311f08fbf6095f713d94e84?d=identicon)[cwmiller](/maintainers/cwmiller)

---

Top Contributors

[![cwmiller](https://avatars.githubusercontent.com/u/3728286?v=4)](https://github.com/cwmiller "cwmiller (45 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/cwm-hypo/health.svg)

```
[![Health](https://phpackages.com/badges/cwm-hypo/health.svg)](https://phpackages.com/packages/cwm-hypo)
```

###  Alternatives

[laravel/telescope

An elegant debug assistant for the Laravel framework.

5.2k67.8M190](/packages/laravel-telescope)[laravel/passport

Laravel Passport provides OAuth2 server support to Laravel.

3.4k85.0M529](/packages/laravel-passport)[spiral/roadrunner

RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins

8.4k12.2M84](/packages/spiral-roadrunner)[nolimits4web/swiper

Most modern mobile touch slider and framework with hardware accelerated transitions

41.8k177.2k1](/packages/nolimits4web-swiper)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M256](/packages/laravel-dusk)[laravel/prompts

Add beautiful and user-friendly forms to your command-line applications.

708181.8M591](/packages/laravel-prompts)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
