laravel的依赖注入

依赖注入的优势

依赖注入的灵活性在于:你 new 这个类的时候可以传入变量, 这个变量的值就很灵活了。你可以随便传入什么变量。如果 hint 是一个 Interface 的话 就更灵活了

<?php

class IndexController
{
    public function __construct(User $user, Order $order)
    {
        echo 'I am IndexController' . PHP_EOL;
        $user->foo();
        $order->foo();
    }

    public function testAction(Order $order)
    {
        $order->foo();
    }
}

class User
{
    public function foo()
    {
        echo 'i am user foo' . PHP_EOL;
    }
}

class Order
{
    public function foo()
    {
        echo 'i am order foo' . PHP_EOL;
    }
}

function make($className)
{
    $reflector    = new ReflectionClass($className);
    $dependencies = $reflector->getConstructor()->getParameters();

    $results = [];
    foreach ($dependencies as $dependency) {
        $class     = $dependency->getClass();
        $results[] = new $class->name;
    }

    //Creates a new class instance from given arguments
    return $reflector->newInstanceArgs($results);
}

$instance   = make('IndexController');
$action     = 'testAction';

$reflector  = new \ReflectionMethod($instance, $action);

$parameters = [];
foreach ($reflector->getParameters() as $key => $parameter) {
    $class = $parameter->getClass();
    $parameters[] = new $class->name;
}

call_user_func_array([$instance, $action], $parameters);