这里有几个有趣的阅读:What is currying
What is dependency injection
无论是哪种编程语言或框架,我们都可以说“依赖注入”(DI)类似于
OOP 类定义中的委托(参见示例)和 Currying 完全不同,比如说函数参数简化。
DI 让您的类保持简单和解耦。如果你熟悉 Laravel,ServiceProvider 就是一个很好的例子。简而言之,您的类有一个属性,该属性将设置为另一个类的实例(通常实现接口),以便您可以委托某些功能。典型的例子是:
interface LogInterface {
public function write();
}
class LogToFile implements LogInterface {
public function write()
{
//Do something
}
}
class LogToFileDB implements LogInterface {
public function write()
{
//Do something
}
}
class MyDIClass {
private $log;
public function __construct(LogInterface $log){
$this->log = $log;
}
public function writeLog(){
$this->log->write();
}
}
//You can do
$myobj = new MyDIClass(new LogToFile);
//or you can do
//$myobj = new MyDIClass(new LogToDB);
//this will work, no worries about "write()" you are delegating through DI
$myobj->writeLog();
我刚刚在上面写了这段代码(可能没有功能)来说明 DI。使用该接口可以确保方法“write()”将在任何实现 LogInterface 的类中实现。然后,当实例化对象时,您的类会强制获取 LogInterface 对象。忘记“write()”是如何工作的,这不关你的事。
关于柯里化,技术是不同的,您只需简化函数中的参数即可。当使用 Slim 框架时,这些家伙说“你可以使用 $app 来咖喱你的路线”。我经常使用 Slim,我的理解是,好吧,与其将几个变量传递给你的路线闭包,不如丰富你的 $app 变量并传递 1 个单个 var:$app
$app = new \Slim\Slim();
//Rather than
//$app->get('/foo', function () use ($app, $log, $store, ...) {
$app->get('/foo', function () use ($app) {
$app->render('foo.php'); // <-- SUCCESS
$app->log->write();
$app->db->store();
});