Skip to content

Instantly share code, notes, and snippets.

@mnapoli
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mnapoli/df864c443bf8e9e11856 to your computer and use it in GitHub Desktop.
Save mnapoli/df864c443bf8e9e11856 to your computer and use it in GitHub Desktop.
PHP-DI object definitions
interface MoneyStorage {
}
class BankAccount implements MoneyStorage {
    public function __construct(Logger $logger, $account) ...
}
return [
    // Binding
    MoneyStorage::class => object(BankAccount::class),
    // is actually
    MoneyStorage::class => get(BankAccount::class),
    // or
    MoneyStorage::class => object(BankAccount::class)
        ->inherit(true),

    // Binding + override autowiring
    MoneyStorage::class => object(BankAccount::class)
        ->constructorParameter('account', 123),
    // is actually
    MoneyStorage::class => get(BankAccount::class),
    BankAccount::class => object()
        ->constructorParameter('account', 123),
    // or
    MoneyStorage::class => object(BankAccount::class)
        ->inherit(true)
        ->constructorParameter('account', 123),
        
    // Binding (but actually inherit + overrides autowiring)
    'money' => object(BankAccount::class)
        ->constructorParameter('account', 123),
    // is actually
    'money' => object(BankAccount::class)
        ->autowiring()
        ->constructorParameter('account', 123),
    // or
    'money' => object(BankAccount::class)
        ->inherit(true)
        ->constructorParameter('account', 123),
        
    // Inherit + override
    'foo' => object('money')
        ->constructorParameter('account', 123),
    // is actually
    'foo' => inherit('money')
        ->constructorParameter('account', 123),
    // or
    'foo' => object('money')
        ->inherit(true)
        ->constructorParameter('account', 123),
        
    // Complete override
    'foo' => object(BankAccount::class)
        ->constructor(Logger::class, 123),
    // can be
    'foo' => object('money')
        ->inherit(false)
        ->constructor(Logger::class, 123),
];

keeping current behavior

Cons:

  • can't redeclare something from scratch
  • non-obvious inheritance
  • nested definitions are not declared from scratch -> weird

changing current behavior

return [
    MoneyStorage::class => get(BankAccount::class),

    MoneyStorage::class => object(BankAccount::class)
        ->inherit()
        ->constructorParameter('account', 123),
        
    'money' => object(BankAccount::class)
        ->inherit()
        ->constructorParameter('account', 123),
        
    'foo' => object()
        ->inherit('money')
        ->constructorParameter('account', 123),
        
    'foo' => object(Foo::class)
        ->inherit('money')
        ->constructorParameter('account', 123),
        
    'foo' => object(BankAccount::class)
        ->constructor(Logger::class, 123),
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment